/* A frequency table for Random Numbers 乱数について、 0-1までの1000点幅で区切って(0.000-0.009,0.010-0.019,...,0.990-0.999, 1の1001ランク)、 各ランクの度数分布(ヒストグラム)を求める。 */ #include <stdio.h> #include <stdlib.h> #include <math.h> #define Num 100000 /*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,rank,histo[1001]; double a[Num+1]; for (i=0;i<=1000;i++) histo[i]=0; for (i=0;i<Num;i++){ a[i]=ran1(&idum); } for (i=0;i<Num;i++){ rank=a[i]*1000.0; if (0<=rank && rank<=1000) histo[rank]++; } for(i=0;i<1000;i++) printf("%d %d\n", i, histo[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; }
出力結果
100が平均。横軸が区間、縦軸が頻度。
Back to C Language