XRAND.C
资源名称:mercwsrc.zip [点击查看]
上传用户:kesirui
上传日期:2007-01-07
资源大小:263k
文件大小:2k
源码类别:
Internet/网络编程
开发平台:
WINDOWS
- #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.4fn", 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;
- }