どう書く?org : 2次元ランダムウォーク

original page : http://ja.doukaku.org/193/

2次元ランダムウォークをつくってみてください。

******

元は3本建てにしようかと思ったけど、上の一本に絞りました。おまけとして、3本とも下に補足しておきます。作れるようでしたら作ってみてください。

1.一次元のランダムウォークを作ってください。

1.1 データファイルに残してください。 フォーマット:時間 位置

おまけ)

可視化が簡単な処理系・プログラミング言語でしたら実際に可視化してみてください。フォーマットしたファイルをスプレッドシートやplotutilitiesなどの可視化ソフトを使って、実際に動きをかくにんしてみましょう。:-)

2.同じように2次元のランダムウォークを作ってください。

2.1 1.1と同じようにしてください。

フォーマット:時間 x位置 y位置

3.凝りたければ、アニメーションにするもよし、3次元の動きをとるもよし、自分の想像力がいかせるところまでやってみてください。

http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%AF

分からないというヒトへの分かりにくいヒント:

今の位置から次の時間の位置が決まるのですが、決まりかたが、乱数で一歩後退するか一歩先にいくか?ということをやればよいです。

#6871

original page : http://ja.doukaku.org/comment/6871/

本職ではありませんが・・・

simecolというライブラリーに、ランダムウォークを実装するためのフレームワークが用意されています。

もちろんアニメーションもします。

library(simecol)

size <- 50
obj <- rwalkModel(
  parms = list(size=size, area=c(0, size, 0, size)),
  init  = data.frame(time=0, x=size/2, y=size/2),
  times = c(from=0, to=100, by=1),
  main  = function(time, init, parms) {
    r <- 2 * pi * runif(1)
    data.frame(time=time, x=((init$x + cos(r)) %% parms$size), 
               y=((init$y + sin(r)) %% parms$size))
  }
)
sim(obj, animate=T)

#6897

original page : http://ja.doukaku.org/comment/6897/

もっといえば、1〜4の乱数が欲しいようなときはrunif()ではなくsample()を使った方がRっぽいかもです。

plot(cumsum(data.frame(x=c(1,-1,0,0), y=c(0,0,1,-1))[sample(4, t, replace=T),]), type="b")