みその計算物理学
ホーム はじめに リンク集
ランダムウォークの数値計算例(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の平方根に近づいていく。