XRAND.C
上传用户:kesirui
上传日期:2007-01-07
资源大小:263k
文件大小:2k
源码类别:

Internet/网络编程

开发平台:

WINDOWS

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef unsigned char bool;
  5. #define TRUE 1
  6. #define TRIAL_MAX 1000000
  7. #define SQUARE(x) ( (x) * (x) )
  8. int number_range ( int from, int to );
  9. int number_mm ( void );
  10. int main( argc, argv )
  11.     int argc;
  12.     char *argv[];
  13. {
  14.     int nBin;
  15.     for ( nBin = 2; nBin < 1000; nBin++ )
  16.     {
  17. int * prgiBin;
  18. int iRand;
  19. int iBin;
  20. int nMean;
  21. int nSigma2;
  22. double dSigma;
  23. prgiBin = calloc( nBin, sizeof(int) );
  24. for ( iRand = 0; iRand < TRIAL_MAX; iRand++ )
  25.     prgiBin[number_range(0, nBin-1)] += 1;
  26. nMean = TRIAL_MAX / nBin;
  27. nSigma2 = 0;
  28. for ( iBin = 0; iBin < nBin; iBin++ )
  29.     nSigma2 += SQUARE( prgiBin[iBin] - nMean );
  30. dSigma   = sqrt( (double) (nSigma2 / (nBin - 1)) );
  31. printf( "%6d %6.4fn", nBin, dSigma / nMean );
  32. free( prgiBin );
  33.     }
  34.     return 0;
  35. }
  36. /*
  37.  * Generate a random number.
  38.  */
  39. int number_range( int from, int to )
  40. {
  41.     int power;
  42.     int number;
  43.     if ( ( to = to - from + 1 ) <= 1 )
  44. return from;
  45.     for ( power = 2; power < to; power <<= 1 )
  46. ;
  47.     while ( ( number = number_mm( ) & (power - 1) ) >= to )
  48. ;
  49.     return from + number;
  50. }
  51. int number_mm( void )
  52. {
  53.     static int rgiState[3+55];
  54.     int *piState;
  55.     int iState1;
  56.     int iState2;
  57.     int iRand;
  58.     piState = &rgiState[0];
  59.     if ( piState[0] == 0 )
  60.     {
  61. int iState;
  62. piState[3+0] = 1;
  63. piState[3+1] = 1;
  64. for ( iState = 3+2; iState < 3+55; iState++ )
  65. {
  66.     piState[iState] = (piState[iState-1] + piState[iState-2])
  67.     & ((1 << 30) - 1);
  68. }
  69. piState[0] = 1;
  70. piState[1] = 3+55 - 55;
  71. piState[2] = 3+55 - 24;
  72.     }
  73.     iState1   = piState[1];
  74.     iState2   = piState[2];
  75.     iRand   = (piState[iState1] + piState[iState2])
  76. & ((1 << 30) - 1);
  77.     piState[iState1] = iRand;
  78.     if ( ++iState1 == 3+55 )
  79. iState1 = 3+0;
  80.     if ( ++iState2 == 3+55 )
  81. iState2 = 3+0;
  82.     piState[1] = iState1;
  83.     piState[2] = iState2;
  84.     return iRand >> 6;
  85. }