#include <stdio.h> #include <stdlib.h> void main () for (i=0;i<=100;i++) } |
(例題P1−1)
下のプログラムは [0,1) の乱数の度数分布を調べるプログラムである。区間は2等分である。作成し、実行してみましょう。
(実行結果)
% ./a.out
seed ? 2
n ? 1000
0 <= x <0.5 : 469
0.5<= x <1 : 531
srand は乱数の種を設定する関数で引数には正の整数を代入します。
(課題P1−1)
上のプログラムで seed を変えて実行しなさい。結果がどうなるか観察しなさい。どのくらいのばらつきがあるか。平均値は?標準偏差は?プログラムを作ってもよいし電卓で計算してもよいです。
を行います。作成して実行し、横軸 i 縦軸 ix として gnuplot でプロットしましょう。
% gcc pex1-2.c -o pex1-2
% ./pex1-2
seed ? 100
n ? 1000
% gnuplot
gnuplot>plot "out.d" w l
(課題P1−2)
例題P1-2のプログラムを作成して、乱数の種 seed を変えて、グラフがどのようになるか観察してみよう。
ランダム・ウォークが、N ステップで平均してどのくらいの距離を進むかを考えてみよう。N ステップ経った時の位置を xN とすれば、この地点の原点(始めの位置)からの距離の2乗 dN は
dN= xN * xN
である。dN は始めの乱数の種にも依存する。そこで dN の"平均値"が N に対してどのように依存するのか考えよう。ステップ数 N のとき、いろいろな乱数の種から始めて dN の計算を M 回行い、それらを dN(1), dN(2), ...., dN(M) とする。それらを使って 進んだ距離の平均値を dNの平均値の平方根(√) をとったもの
√<dN>= √ [ ( dN(1)+dN(2)+ ... + dN(M) )/M ]
とする。
(課題P1−3)
ステップ数 N=100、初期値の数 M=10 として、距離の平均値 √<dN> を計算しなさい。さらに、N=10000、 M=10として √<dN> を計算しなさい。計算には電卓を使ってもよいし、プログラムを作成してもよい。
M が大きくなると √<d_N> がどの値に近づくか調べよう。例題のプログラムと電卓で計算するのはたいへんなので、プログラムを改良するとよい。
もし同じ乱数の種から計算を始めるといつも同じ dN が得られてしまう。"平均値" をとるためにはいろいろな乱数の種から始めて d_N を計算を行う。いろいろな乱数の種から始める一つの方法は、N ステップの計算を M 回連続して繰り返すことである。つまり 、1 回目の N ステップの計算の種はインプットから与えて、2回目以降はその前の計算の最後の乱数を種とすれば良い。
結局、N 回のステップのためのループと 、それをM 回繰り返すためのループの2重ループをつくる。N ステップの計算を繰り返すたびに、それまでに得られた dN から平均値を計算し、出力する。
(課題P1ー4)
(例題P1−2)の i のループの外側にもう1つループを作って √<d_N> を M 回計算するプログラムを作成しなさい。N=100 として M=10, 100, 1000, 10000 として実行し、√<d_N> が、大きい M に対してどの値に近づくか予想しなさい。また、 同様に N=10000,
M=10, 100, 1000, 10000 として実行し、√<d_N> が、大きい M に対してどの値に近づくか予想しなさい。
(参考)下の図は、N=10000 として、Mを変化させたときの √<d_N> の値を示したもの。
(余裕のある人へ)(課題P1−5)
2次元のランダム・ウォークで、課題P1−3と同様のことをやってみよう。2次元のランダム・ウォークの場合、
1、粒子は正方格子上を動く。
2、毎回でたらめな方向に動く。
という模型である。この模型はブラウン運動や気体分子の拡散などの物理学のいろいろな問題に応用されている。
さて、2次元の場合、始めに (0,0) にある粒子は 、上下左右 (1,0), (-1,0),
(-1,0), (1,0) のどれかに 1/4 の確率で動く。次に、動いた点からまた確率1/4 で上下左右に動く。これを
N 回繰り返して、どこまで移動したかを調べる。
(例) 10000 ステップの例。gnuplot の "with line" は直線でデータを結ぶためのオプション。
% gnuplot
gnuplot> plot "rw.d" with line
gnuplot>
距離の平均を、
dN= xN * xN + yN
* yN
√<dN>= √ [ ( dN(1)+dN(2)+ ... + dN(M) )/M ]
として、N=100, 10000 について、大きい M に対して √<dN>
がどのように近づくか?