ランダムウォークの数値計算例(C言語) |
- プログラムソース
2次元上の基本的なランダムウォーク。
#include <stdio.h>
#include <stdlib.h>
#define n 10000 //最大繰り返し回数
int main()
{
int i;
double x,y,rn;
FILE *output;
output=fopen("output.data","w");
x=y=0.0; //原点からスタート
fprintf(output,"%f %f\n",x,y);
for(i=1;i<n;i++) {
rn=rand()/(RAND_MAX+1.0); //0から1の乱数を発生
//乱数の数字の範囲によって4つの方向のどちらかへ移動
if(rn<0.25) x=x-1.0;
else if(rn>=0.25 && rn<0.5) x=x+1.0;
else if(rn>=0.5 && rn<0.75) y=y-1.0;
else y=y+1.0;
fprintf(output,"%f %f\n",x,y);
}
fclose(output);
return 0;
}
- GNUPLOT出力結果
- プログラムソース
ランダムウォークをm回繰り返し原点からの平均距離をだす。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define n 100 //最大繰り返し回数
#define m 10000 //ランダムウォーク繰り返し回数
#define seed 7892 //乱数の発生初期値を変える種
int main()
{
int i,j;
double x,y,r,rn,sum,average;
FILE *output;
output=fopen("output.data","w");
sum=0.0;
srand(seed);
for(j=1;j<m;j++) {
x=y=0.0;
for(i=1;i<n;i++) {
rn=rand()/(RAND_MAX+1.0); //0から1の乱数を発生
//乱数の数字の範囲によって4つの方向のどちらかへ移動
if(rn<0.25) x=x-1.0;
else if(rn>=0.25 && rn<0.5) x=x+1.0;
else if(rn>=0.5 && rn<0.75) y=y-1.0;
else y=y+1.0;
}
r=sqrt(x*x+y*y); //原点から到達点までの距離
sum+=r; //距離の合計
}
average=sum/m; //距離の平均値
printf("%f\n",average);
fclose(output);
return 0;
}
- 出力結果
8.764720
ランダムウォーク繰り返し回数mを大きくするほど、原点から到達点までの距離が、移動回数nの平方根に近づいていく。
|
|
|