#include <math.h> #include <stdio.h> #include <stdlib.h> typedef unsigned char bool; #define TRUE 1 #define TRIAL_MAX 1000000 #define SQUARE(x) ( (x) * (x) ) int number_range ( int from, int to ); int number_mm ( void ); int main( argc, argv ) int argc; char *argv[]; { int nBin; for ( nBin = 2; nBin < 1000; nBin++ ) { int * prgiBin; int iRand; int iBin; int nMean; int nSigma2; double dSigma; prgiBin = calloc( nBin, sizeof(int) ); for ( iRand = 0; iRand < TRIAL_MAX; iRand++ ) prgiBin[number_range(0, nBin-1)] += 1; nMean = TRIAL_MAX / nBin; nSigma2 = 0; for ( iBin = 0; iBin < nBin; iBin++ ) nSigma2 += SQUARE( prgiBin[iBin] - nMean ); dSigma = sqrt( (double) (nSigma2 / (nBin - 1)) ); printf( "%6d %6.4f\n", nBin, dSigma / nMean ); free( prgiBin ); } return 0; } /* * Generate a random number. */ int number_range( int from, int to ) { int power; int number; if ( ( to = to - from + 1 ) <= 1 ) return from; for ( power = 2; power < to; power <<= 1 ) ; while ( ( number = number_mm( ) & (power - 1) ) >= to ) ; return from + number; } int number_mm( void ) { static int rgiState[3+55]; int *piState; int iState1; int iState2; int iRand; piState = &rgiState[0]; if ( piState[0] == 0 ) { int iState; piState[3+0] = 1; piState[3+1] = 1; for ( iState = 3+2; iState < 3+55; iState++ ) { piState[iState] = (piState[iState-1] + piState[iState-2]) & ((1 << 30) - 1); } piState[0] = 1; piState[1] = 3+55 - 55; piState[2] = 3+55 - 24; } iState1 = piState[1]; iState2 = piState[2]; iRand = (piState[iState1] + piState[iState2]) & ((1 << 30) - 1); piState[iState1] = iRand; if ( ++iState1 == 3+55 ) iState1 = 3+0; if ( ++iState2 == 3+55 ) iState2 = 3+0; piState[1] = iState1; piState[2] = iState2; return iRand >> 6; }