2次元ランダムウォーク
Posted feedbacks - Other
uwsc はマウスとキーボード入力を記録して再生するソフトですが スクリプト言語を備えています。 これを使ってランダムウォークをやってみました。出力にはwindows 付属の paint を使いましたが、マウスのドラッグで線が描けるソフトならなんでも いいと思います。 paint などでマウスのドラッグで線が描ける状態にして、uwsc を起動して このスクリプトを読み込みます。マウスを開始したい位置に移動して ALT+F1 で再生、ALT+F2で停止します。
see: uwsc
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);
}
}
|





ytakenaka
#6806()
Rating2/2=1.00
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
分からないというヒトへの分かりにくいヒント:
今の位置から次の時間の位置が決まるのですが、決まりかたが、乱数で一歩後退するか一歩先にいくか?ということをやればよいです。
[ reply ]