ランダムウォーク
ランダムウォークは確率的な運動モデルの一種で、次にどちらに動くかを確率的に決めるため不規則な挙動を示します。 ここでは2次元のランダムウォークモデルとして、一ステップ毎に上下左右4方向に一定距離ランダムに移動する場合を考えます。ステップ数を10、100、1000、10000と変え各ステップで100回試行し、移動後の位置の分布を比べます。移動方向がランダムなのでステップ数が多くなると上下左右の出現数が収束し各方向への移動距離が均等化され、スタート位置に戻ってきそうですが実際はそうはならず、ステップ数が多い程、移動後の位置は広く分布します。
環境
コード
移動方向の選択は、以下の4つの移動距離の組み合わせをタプルにして、その内一つを標準ライブラリrandomのrandom.choiceを用いてランダムに選択しています。
x -1 y 0 ・・・左に移動
x 1 y 0 ・・・右に移動
x 0 y -1 ・・・上に移動
x 0 y 1・・・下に移動
import random import numpy as np import cv2 def randomwalk(points, steps): height, width = 500, 500 step_list = ((-1, 0), (1, 0), (0, -1), (0, 1)) img = np.zeros((height, width, 3), np.float64) for i in range(points): x = int(width/2) y = int(height/2) for t in range(steps): step = random.choice(step_list) x += step[0]*5 y += step[1]*5 cv2.rectangle(img, (x-2, y-2), (x+2, y+2), (0, 128, 255), -1) cv2.rectangle(img, (int(width/2)-2, int(height/2)-2), (int(width/2)+2, int(height/2)+2), (0, 255, 0), -1) filename = 'randomwalk'+str(points)+'_'+str(steps)+'.png' cv2.imwrite(filename, img) randomwalk(points=100, steps=10) randomwalk(points=100, steps=100) randomwalk(points=100, steps=1000) randomwalk(points=100, steps=10000)
実行結果
10ステップ移動した場合(点は100個)
100ステップ移動した場合(点は100個)
1000ステップ移動した場合(点は100個)
10000ステップ移動した場合(点は100個) 。大半の点は画像の外に移動しています。
以下のサイトを参考にさせていただきました
ランダムウォーク『ウィキペディア(Wikipedia)』
Pythonの文法メモ >> 【標準ライブラリ】randomによる乱数生成
Pythonの文法メモ >> 【OpenCV】長方形を描画するrectangle