home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / MM1 / GRAPHICS / ssaver.lzh / SRC / rand.c < prev    next >
Text File  |  1995-04-02  |  2KB  |  99 lines

  1. /*
  2.  * A very random generator, period approx 6.8064e16.
  3.  * 
  4.  * Uses algorithm M, "Art of Computer Programming", Vol 2. 1969, D.E.Knuth.
  5.  * 
  6.  * Two generators are used to derive the high and low parts of sequence X, and
  7.  * another for sequence Y. These were derived by Michael Mauldin.
  8.  * 
  9.  * Usage:  initialize by calling srand(seed), then rand() returns a random
  10.  * number from 0..2147483647. srand(0) uses the current time as the seed.
  11.  * 
  12.  * Author: Michael Mauldin, June 14, 1983. adapted to OS-9/68000 C-Library by
  13.  * Christian Engel, Sat Oct 17 01:39:27 1987
  14.  */
  15.  
  16. /*
  17. ** time () called with NULL argument and <stdio.h> included
  18. ** randint (non ANSI) commented
  19. ** AM 20/12/90
  20. */
  21.  
  22. #ifndef NULL
  23. #include <stdio.h>
  24. #endif
  25.  
  26. /*
  27.  * Rand 1, period length 444674
  28.  */
  29. #define MUL1  1156
  30. #define OFF1  312342
  31. #define MOD1  1334025
  32. #define RAND1 (seed1=((seed1*MUL1+OFF1)%MOD1))
  33. #define Y     RAND1
  34.  
  35. /*
  36.  * Rand 2, period length 690709
  37.  */
  38. #define MUL2  1366
  39. #define OFF2  827291
  40. #define MOD2  1519572
  41. #define RAND2 (seed2=((seed2*MUL2+OFF2)%MOD2))
  42.  
  43. /*
  44.  * Rand 3, period length 221605
  45.  */
  46. #define MUL3  1156
  47. #define OFF3  198273
  48. #define MOD3  1329657
  49. #define RAND3 (seed3=((seed3*MUL3+OFF3)%MOD3))
  50.  
  51. /*
  52.  * RAND2 generates 19 random bits, RAND3 generates 17. The X sequence is made
  53.  * up off both, and thus has 31 random bits.
  54.  */
  55.  
  56. #define X ((RAND2<<13 ^ RAND3>>3) & 017777777777)
  57.  
  58. #define AUXLEN 97
  59.  
  60. static int seed1 = 872978, seed2 = 518652, seed3 = 226543;
  61. static int auxtab[AUXLEN];
  62.  
  63. /*
  64.  * s r a n d
  65.  */
  66. srand(seed)
  67. int seed;
  68. {
  69.   register int i;
  70.  
  71.   if (seed == 0)
  72.     seed = time(NULL);
  73.  
  74.   /*
  75.    * Set the three random number seeds
  76.    */
  77.   seed1 = (seed1 + seed) % MOD1;
  78.   seed2 = (seed2 + seed) % MOD2;
  79.   seed3 = (seed3 + seed) % MOD3;
  80.  
  81.   for (i = AUXLEN; i--;)
  82.     auxtab[i] = X;
  83. }
  84.  
  85. /*
  86.  * r a n d
  87.  */
  88. int rand()
  89. {
  90.   register int j, result;
  91.  
  92.   j = AUXLEN * Y / MOD1;    /* j random from 0..AUXLEN-1 */
  93.   result    = auxtab[j];
  94.   auxtab[j] = X;
  95.  
  96.   return(result);
  97. }
  98.  
  99.