challenge 2次元ランダムウォーク

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

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

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

Posted feedbacks - Other

uwsc はマウスとキーボード入力を記録して再生するソフトですが
スクリプト言語を備えています。
これを使ってランダムウォークをやってみました。出力にはwindows 付属の
paint を使いましたが、マウスのドラッグで線が描けるソフトならなんでも
いいと思います。
paint などでマウスのドラッグで線が描ける状態にして、uwsc を起動して
このスクリプトを読み込みます。マウスを開始したい位置に移動して
ALT+F1 で再生、ALT+F2で停止します。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
dim dx[4]=-1,1,0,0
dim dy[4]=0,0,-1,1
t=input("歩数(dot)=",500)
w=input("歩幅(dot)=",5)
x=G_MOUSE_X
y=G_MOUSE_Y
btn(left,down,x,y)
for i=1 to t
  r=random(4)
  x=x+w*dx[r]
  y=y+w*dy[r]
  mmv(x,y,10)
next
btn(left,up)

動作には直接影響しませんが、いくつか訂正します。
パラメータ入力の文字列の部分が変でした。

t=input("歩数(dot)=",500)

歩数の単位は歩幅なので (dot) は間違いでした。
パラメータの入力の順番は歩幅を先にした方が良いのかな。
配列に初期値を設定する場合は、要素数は省略可能でした。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
dim dx[]=-1,1,0,0
dim dy[]=0,0,-1,1
w=input("歩幅(dot)",5)
t=input("歩数",500)
x=G_MOUSE_X
y=G_MOUSE_Y
btn(left,down,x,y)
for i=1 to t
  r=random(4)
  x=x+w*dx[r]
  y=y+w*dy[r]
  mmv(x,y,10)
next
btn(left,up)

Processing は可視化が容易です。とりあえずシンプル版。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int x, y, t;

int d = 1;

void setup() {
  x = width / 2;
  y = height / 2;
  t = 0;
//  randomSeed(0);
}

void draw() {
  t += 1;
  float r = random(1);
  if (r < 0.25) {
    x += d;
  } else if (r < 0.5) {
    x -= d;
  } else if (r < 0.75) {
    y += d;
  } else {
    y -= d;
  }
  point(x, y);
  println(t + " " + x + " " + y);
}

複数の点を扱いアニメーションにした版。 点を増やしていくとランダムウォークと拡散が関係していそう、というのが分かりますね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
int n = 1000;
int t;
Particle[] particles = new Particle[n];

int hsb = 16;

void setup() {
  colorMode(HSB, hsb);
  size(200,200);

  smooth();
  for (int i=0; i < n; i++) {
    Particle p = new Particle(width/2, height/2, 1);
    particles[i] = p;
  }
}

void draw() {
  t += 1;
  float xm = 0;
  float ym = 0;
  for (int i=0; i < n; i++) {
    Particle p = particles[i];
    p.move();
    xm += p.x;
    ym += p.y;
    p.render();
  }

  println(t + " " + xm/n + " " + ym/n); 
  
  rectMode(CORNER);
  fill(hsb, hsb * 0.25);
  rect(0, 0, width, height);
}

class Particle {
  int x;
  int y;
  int d;
  
  Particle(int x_, int y_, int d_) {
    x = x_;
    y = y_;
    d = d_;
  }
  
  void move() {
    float r = random(1);
    if (r < 0.25) {
       x += d;
    } else if (r < 0.5) {
      x -= d;
    } else if (r < 0.75) {
      y += d;
    } else {
      y -= d;
    }
  }
  
  void render() {
    point(x, y);
  }
}

Index

Feed

Other

Link

Pathtraq

loading...