home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume5 / random / random.c
Encoding:
C/C++ Source or Header  |  1989-02-03  |  1.3 KB  |  80 lines

  1. /**
  2.  ** random.c: Minimal Standard Pseudo-Random Number Generator
  3.  **
  4.  ** Author: Fuat C. Baran, Columbia University, 1988
  5.  **
  6.  ** Based on code in "Random Number Generators: Good Ones are Hard to Find",
  7.  ** by Stephen K. Park and Keith W. Miller in Communications of the ACM,
  8.  ** 31, 10 (Oct. 1988) pp. 1192-1201.
  9.  **
  10.  ** Requirements: maxint must be 2^31 -1 or larger.
  11.  **
  12.  ** Compile with -DTEST and run to see if it was implemented correctly.
  13.  **/
  14.  
  15. /* some constants we need */
  16. #define A 16807
  17. #define M 2147483647            /* Mersenne prime 2^31 -1 */
  18. #define Q 127773            /* M div A (M / A) */
  19. #define R 2836                /* M mod A (M % A) */
  20.  
  21. static long seed = 1;            /* initialize with rand_init() */
  22.  
  23.  
  24. /*
  25.  * random:
  26.  * minimal standard random number generator.
  27.  * call rand_init first to initialize seed.
  28.  * returns a random float.
  29.  */
  30.  
  31. float
  32. random () {
  33.     long hi, lo;
  34.     
  35.     hi = seed / Q;
  36.     lo = seed % Q;
  37.     if ((seed = A * lo - R * hi) <= 0)
  38.         seed += M;
  39.     return ((float) seed / M);
  40. }
  41.  
  42.  
  43. /*
  44.  * rand_init:
  45.  * initialize seed.
  46.  */
  47.  
  48. void
  49. rand_init (s)
  50. long s;
  51. {
  52.     seed = s;
  53. }
  54.  
  55.  
  56. #ifdef TEST
  57.  
  58. main () {
  59.     int i;
  60.     float r;
  61.  
  62.     rand_init (1);
  63.     for (i = 0; i < 10000; i++)
  64.     r = random();
  65.     printf ("Seed is %ld (should be 1043618065)\n", seed);
  66. }
  67.  
  68. #else
  69.  
  70. main () {
  71.     int i;
  72.  
  73.     for (i = 0; i < 1000000; i++)
  74.     random();
  75. }
  76.  
  77. #endif /* TEST */
  78.  
  79.  
  80.