/* Random Walk */ #include#include #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define NTAB 32 #define NDIV (1+(IM-1)/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) unsigned long int idum =1024; float ran1(long *); main(void) { double x=0.0, y=0.0; int i=0; for (i=0;i<10000000;i++) { x=ran1(&idum); if (x > 0.5) y++; else if (x < 0.5) y--; printf("%d %f\n", i, y); } return (0); } float ran1(long *idum) { int j; long k; static long iy=0; static long iv[NTAB]; float temp; if(*idum <= 0 || !iy){ if(-(*idum) < 1) *idum =1; else *idum = -(*idum); for (j=NTAB +7;j>=0; j--){ k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; if( j < NTAB) iv[j]=*idum; } iy=iv[0]; } k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; j=iy/NDIV; iy=iv[j]; iv[j]= *idum; if((temp=AM*iy) > RNMX) return RNMX; else return temp; }
出力結果
1000回(平均が0付近)
しかし回数(100000回)を増やすと、平均は0ではない。
ある人はバブルだと言うかもしれない。
もっと回数(10000000回)を増やすと、今度は下に。
ある人はバブル崩壊の影響を表しているというかもしれない。
/* 2-dimensional Random Walk */ #include#include #include #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define NTAB 32 #define NDIV (1+(IM-1)/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) unsigned long int idum =1024; float ran1(long *); /*座標*/ typedef struct { int x; int y; } coordinate; main(void) { coordinate point = {0, 0}; double rn=0.0; int i=0; for (i=0;i<1000000;i++) { rn=ran1(&idum); if (rn < 0.25) point.x++; else if (rn >= 0.25 && rn<0.5) point.x--; else if (rn >= 0.50 && rn<0.75) point.y++; else point.y--; printf("%d %d\n", point.x, point.y); } return (0); } float ran1(long *idum) { int j; long k; static long iy=0; static long iv[NTAB]; float temp; if(*idum <= 0 || !iy){ if(-(*idum) < 1) *idum =1; else *idum = -(*idum); for (j=NTAB +7;j>=0; j--){ k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; if( j < NTAB) iv[j]=*idum; } iy=iv[0]; } k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; j=iy/NDIV; iy=iv[j]; iv[j]= *idum; if((temp=AM*iy) > RNMX) return RNMX; else return temp; }
/* random walk の原点からの距離。 */ #include#include #include #define Num 100000 #define Num2 600 /*Random Number*/ #define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define NTAB 32 #define NDIV (1+(IM-1)/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) unsigned long int idum =1024; float ran1(long *); main() { int i,y=0,rank,rank2,histo2[Num2+1],histo[Num2+1],rw[Num+1]; double a[Num+1]; for (i=0;i<=Num2;i++){ histo[i]=0; histo2[i]=0; } for (i=0;i<Num;i++){ a[i]=0.0; rw[i]=0; } for (i=0;i<Num;i++){ a[i]=ran1(&idum); /*Random Walk*/ if (a[i] >= 0.50){ y++; } else { y--; } rw[i]=y; } /*for (i=0;i<Num;i++){ printf("%d %d\n", i, rw[i]); }*/ for (i=0;i<Num;i++){ rank=rw[i]; if (rank>=0) histo[rank]++; else { rank2=-rank; histo2[rank2]++; } } for(i=0;i<Num2;i++) /*printf("%d %d\n", i, histo[i]);*/ printf("%d %d\n", -i, histo2[i]); } /*random number*/ float ran1(long *idum) { int j; long k; static long iy=0; static long iv[NTAB]; float temp; if(*idum <= 0 || !iy){ if(-(*idum) < 1) *idum =1; else *idum = -(*idum); for (j=NTAB +7;j>=0; j--){ k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; if( j < NTAB) iv[j]=*idum; } iy=iv[0]; } k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum < 0) *idum += IM; j=iy/NDIV; iy=iv[j]; iv[j]= *idum; if((temp=AM*iy) > RNMX) return RNMX; else return temp; }
10000ステップのRWにおける原点からの距離。 正規分布にならない。
100000ステップのRWにおける原点からの距離。 正規分布にならない。
Back to C Language