/*
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

