/* 大数の法則(law of large numbers) 「独立な同一の分布に従う確率変数の平均は、nが大きくなるに従いその期待値に近づく(確率収束する)」 n個の(0,1)の一様乱数の平均を計算し、nが増加するに従ってその値の分布が期待値0.5へ近づくことを確かめる。 */ #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; double mean1(int n); /*平均を求める*/ float ran1(long *); /*乱数*/ main() { int i,n,numrnd; double a; numrnd=200; n=50; for(i=1;i<=numrnd;i++){ a=mean1(n); printf("%d %f\n",i, a); } return; } double mean1(int n) { double a=0.0,b=0.0,c=0.0; int i; for(i=1;i<=n;i++){ b=ran1(&idum); a=a+b; } c=a/n; return c; } 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; }
[出力結果]
この図はn個の(0,1)の一様乱数の平均を計算し、それを200回行っている。
試行回数 n=5(RED)と試行回数 n=50(GREEN)の場合を比べると、試行回数が多い、n=50の方が期待値に近い値をとる。そのため「大数の法則」が働いているということが推測することができる。
Back to C Language