#include <stdio.h> #include <stdlib.h> main() { int i; double r; srand(55); for(i = 0; i < 100; ++i){ r = (double)rand()/RAND_MAX; printf("%lf\n", r); } }
このプログラムでは、100個の乱数を発生・表示します。注意事項は、
では、続いて乱数の発生度数がある分布(例えばガウス分布)に従うような乱数が必要な場合はどうするかということですが、例えば、ヒットミス法と呼ばれる以下の方法を利用することで実現できます。
#include <stdio.h> #include <math.h> #include <stdlib.h> main(){ int i; double r, m, sigma; m = 0.5; sigma = 0.1; for(i = 0; i < 10000; ++i){ while(1){ r = (double)rand()/RAND_MAX; if(1.0/sqrt(2*M_PI*sigma)*exp(-(r-m)*(r-m)/2.0/sigma/sigma) >= (double)ran d()/RAND_MAX) break; } printf("%lf\n",r); } }
この場合、平均0.5、標準偏差0.1となる乱数10000個が発生されます。コンパイル後、例えば、0〜0.1の範囲にある乱数の数を調べるのには下記のコマンドが便利です。
./a.out | gawk '{if ($0 > 0.0 && $0 < 0.1) print $0}' | wcなお、2つの一様乱数からガウス分布を有する2つの乱数を発生する方法にボックス・ミューラー法がある。こちらを調べて利用しても良い。
以上の練習をもとに、前節で作成した粒子に平均値が0.5となる標準偏差0.7となるガウス分布を有する速度()を与えよ。これら速度は配列velocity[200][2]を用意しそれに格納すること。