home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / RAND2.C < prev    next >
Text File  |  1997-07-05  |  1KB  |  54 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /********************************************************************
  4.           The McGill Super-Duper Random Number Generator
  5.              G. Marsaglia, K. Ananthanarayana, N. Paul
  6.   
  7.     Incorporating the Ziggurat method of sampling from decreasing
  8.               or symmetric unimodal density functions.
  9.                       G. Marsaglia, W.W. Tsang
  10.   
  11.                  Rewritten into C by E. Schneider
  12.  *********************************************************************/
  13.   
  14. static unsigned long mcgn, srgn;
  15.   
  16. #define MULT 69069L
  17.   
  18. void rstart (long i1, long i2)
  19. {
  20.       mcgn = (unsigned long)((i1 == 0L) ? 0L : i1 | 1L);
  21.       srgn = (unsigned long)((i2 == 0L) ? 0L : (i2 & 0x7FFL) | 1L);
  22. }
  23.   
  24. long uni(void)
  25. {
  26.       unsigned long r0, r1;
  27.  
  28.       r0 = (srgn >> 15);
  29.       r1 = srgn ^ r0;
  30.       r0 = (r1 << 17);
  31.       srgn = r0 ^ r1;
  32.       mcgn = MULT * mcgn;
  33.       r1 = mcgn ^ srgn;
  34.       return (r1 >> 1);
  35. }
  36.   
  37. long vni(void)
  38. {
  39.       unsigned long r0, r1;
  40.  
  41.       r0 = (srgn >> 15);
  42.       r1 = srgn ^ r0;
  43.       r0 = (r1 << 17);
  44.       srgn = r0 ^ r1;
  45.       mcgn = MULT * mcgn;
  46.       r1 = mcgn ^ srgn;
  47.       return r1;
  48. }
  49.  
  50. /* 
  51. "Anyone who consider arithmetic means of producing random number is,
  52.  of course, in a state of sin" - John Von Neumann
  53. */
  54.