home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_08 / 2n08057a < prev    next >
Text File  |  1991-06-10  |  1KB  |  70 lines

  1. /*
  2.  * Minimal Standard Random Number Generator recommended
  3.  * by S.K. Park and K.W. Miller. (CACM October, 1988).
  4.  */
  5.  
  6. static long seed;
  7.  
  8. #define PRIME    2147483647L    /* 2^31 - 1 */
  9. #define ROOT    16807L
  10. #define QUOT    127773L        /* PRIME DIV ROOT */
  11. #define REMN    2836L        /* PRIME MOD ROOT */
  12.  
  13. /*
  14.  * Define type ldiv_t, function ldiv() to match
  15.  * Microsoft C 5.1 library:
  16.  */
  17.  
  18. typedef struct {
  19.     long quot;
  20.     long rem;
  21. } ldiv_t;
  22.  
  23. ldiv_t ldiv(long int numer, long int denom)
  24. {
  25.     ldiv_t temp;
  26.     
  27.     temp.quot = numer / denom;
  28.     temp.rem = numer % denom;
  29.     return temp;
  30. }
  31.  
  32. /*
  33. **    sets initial seed, ensuring that it is never 0
  34. */
  35.  
  36. void stdsrand(long lseed)
  37. {
  38. extern long time();
  39.  
  40.     seed = lseed & 0x7FFFFFFF;
  41.     while (seed == 0L) {
  42.         seed = time((long *) 0) % PRIME;
  43.     }
  44. }
  45.  
  46. /*
  47. **    returns uniformly distributed long integers
  48. **    in the range 1..2147483646
  49. */
  50.  
  51. long stdrand()
  52. {
  53. ldiv_t temp;
  54. long test;
  55.  
  56.     if (seed == 0L)
  57.         stdsrand(0L);
  58.  
  59.     temp = ldiv(seed, QUOT);
  60.     test = ROOT * temp.rem - REMN * temp.quot;
  61.  
  62.     if (test > 0L) {
  63.         seed = test;
  64.     } else {
  65.         seed = test + PRIME;
  66.     }
  67.  
  68.     return (seed);
  69. }
  70.