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

  1. /*
  2.     An extension of the minimal standard that
  3.     increases the Length of the sequence from
  4.     (2^31 - 2) to about (2^62).
  5. */
  6.  
  7. static long seed1;
  8. static long seed2;
  9.  
  10. #define PRIME1    2147483563L
  11. #define ROOT1    40014L
  12. #define QUOT1    53668L        /* PRIME1 / ROOT1 */
  13. #define REMN1    12211L        /* PRIME1 % ROOT1 */
  14. #define PRIME2    2147483399L
  15. #define ROOT2    40692L
  16. #define QUOT2    52774L        /* PRIME2 / ROOT2 */
  17. #define REMN2    3791L        /* PRIME2 % ROOT2 */
  18.  
  19. /*
  20.  * Define type ldiv_t, function ldiv() to match
  21.  * Microsoft C 5.1 library:
  22.  */
  23.  
  24. typedef struct {
  25.     long quot;
  26.     long rem;
  27. } ldiv_t;
  28.  
  29. ldiv_t ldiv(long int numer, long int denom)
  30. {
  31.     ldiv_t temp;
  32.  
  33.     temp.quot = numer / denom;
  34.     temp.rem = numer % denom;
  35.     return temp;
  36. }
  37.  
  38. void extsrand(long lseed1, long lseed2)
  39. {
  40. extern long time();
  41.  
  42.     seed1 = lseed1 & 0x7FFFFFFF;
  43.     seed2 = lseed2 & 0x7FFFFFFF;
  44.     while ( (seed1 == 0L) || (seed2 == 0L) ) {
  45.         seed1 = time((long*)0) % PRIME1;
  46.         seed2 = time((long*)0) % PRIME2;
  47.     }
  48. }
  49.  
  50. long extrand()
  51. {
  52. ldiv_t temp;
  53. long test;
  54.  
  55.     if ((seed1 == 0L) || (seed2 == 0L))
  56.         extsrand(0L, 0L);
  57.  
  58.     temp = ldiv(seed1, QUOT1);
  59.     test = ROOT1 * temp.rem - REMN1 * temp.quot;
  60.  
  61.     if (test > 0L) {
  62.         seed1 = test;
  63.     } else {
  64.         seed1 = test + PRIME1;
  65.     }
  66.  
  67.     temp = ldiv(seed2, QUOT1);
  68.     test = ROOT2 * temp.rem - REMN2 * temp.quot;
  69.  
  70.     if (test > 0L) {
  71.         seed2 = test;
  72.     } else {
  73.         seed2 = test + PRIME2;
  74.     }
  75.  
  76.     /* mask seed1 with 0xFFFF0000 for full range */
  77.     return(((seed1 <  1) & 0x7FFF0000)
  78.          | ((seed2 > 14) & 0x0000FFFF));
  79. }
  80.