牛乳を薄めて顕微鏡で観察すると、脂肪の粒が不規則に動くのが見える。これは脂肪の粒(直径数ミクロン)に、小さくて目には見えない水分子がランダムにぶつかるためで、このような運動をブラウン運動という。ブラウン運動は19世紀半ばにロバート・ブラウンが発見した。そのときには、花の花粉に含まれる微粒子(花粉そのものではなく、もっと細かいもの)が不規則に動くところが観察された。
1905年にアインシュタインは、ブラウン運動は水分子の衝突によるものだとする理論を発表した。フランスのジャン・ペランがこの理論に基づいて実験を行い、その結果からたしかに水分子が実在することを確認した。実は、当時はまだ「分子」というものが実在するのかどうかがはっきりしていなかったのである。
乱数を使ったシミュレーションでこのブラウン運動を再現してみよう。ここでは、水分子の存在は忘れて、粒子がランダムに動く様子をアニメーションにする。このようなモデルを「酔歩」(random walk)のモデルという。
まずは、直線の上を左右にランダムに動く1個の円の運動から。下のプログラムは、各ステップで1個の乱数を使って-1か1をランダムに作り、その値の分だけ位置を動かしている。円の直径が10なので、各回に動く距離は直径の1/10になっている。最初の位置は画面の真ん中である。
int x; void setup(){ size(500,100); frameRate(20); x=250; } void draw(){ x += int(random(2))*2-1; background(0); ellipse(x,50,10,10); }
これをたくさんの粒子にしてみよう。xを配列に変えて、100個の位置を記憶させることにする。最初はすべて、真ん中に集まっているものが、次第に広がって行く様子が見られる
int x[] = new int[100]; int i; void setup(){ size(500,100); frameRate(20); for(i=0; i<100; ++i){x[i]=250;} } void draw(){ background(0); for(i=0; i<100; ++i){ x[i] += int(random(2))*2-1; } for(i=0; i<100; ++i){ ellipse(x[i],50,10,10); } }
続いては、平面の上を上下左右にランダムに動く1個の粒子の運動。下のプログラムは、各ステップでxとyの二つを乱数を使って発生する。それぞれ横の位置と縦の位置を変化させる。
int x,y; void setup(){ size(500,500); frameRate(20); x=250; y=250; } void draw(){ x += int(random(2))*2-1; y += int(random(2))*2-1; background(0); ellipse(x,y,10,10); }
粒子の数をもっと増やして、たとえば1000個の粒子が動くプログラムに変更せよ。各粒子の位置を配列にする。つまりdouble x[1000],y[1000]
のようにする。