home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / numana01.zip / SRC / RAND.MOD < prev    next >
Text File  |  1996-08-07  |  2KB  |  60 lines

  1. IMPLEMENTATION MODULE Rand;
  2.  
  3.         (********************************************************)
  4.         (*                                                      *)
  5.         (*              Random number generator                 *)
  6.         (*                                                      *)
  7.         (*  Programmer:         P. Moylan                       *)
  8.         (*  Last edited:        7 August 1996                   *)
  9.         (*  Status:             Working                         *)
  10.         (*                                                      *)
  11.         (*      The algorithm is the method of Pierre L'Ecuyer, *)
  12.         (*      Efficient and Portable Combined Random Number   *)
  13.         (*      Generators, CACM 31(6), June 1988, 742-749.     *)
  14.         (*      This is his version for 32-bit machines.        *)
  15.         (*                                                      *)
  16.         (*      This version is about 50% slower than the       *)
  17.         (*      PMOS random number generator, but it's more     *)
  18.         (*      portable.  I haven't done enough tests to       *)
  19.         (*      judge which one is "more random".               *)
  20.         (*                                                      *)
  21.         (********************************************************)
  22.  
  23. VAR s1, s2: INTEGER;
  24.  
  25.     (* These are the two seed values.  The basis of the algorithm       *)
  26.     (* below is to use two separate random number generators, and       *)
  27.     (* to combine their output; the result is a random number stream    *)
  28.     (* with a very long cycle time.                                     *)
  29.  
  30. (************************************************************************)
  31.  
  32. PROCEDURE RANDOM(): REAL;
  33.  
  34.     CONST scale = 4.656613E-10;
  35.  
  36.     VAR Z, k: INTEGER;
  37.  
  38.     BEGIN
  39.         k := s1 DIV 53668;
  40.         s1 := 40014 * (s1 - k*53668) - k*12211;
  41.         IF s1 < 0 THEN INC (s1, 2147483563) END(*IF*);
  42.  
  43.         k := s2 DIV 52774;
  44.         s2 := 40692 * (s2 - k*52774) - k*3791;
  45.         IF s2 < 0 THEN INC (s2, 2147483399) END(*IF*);
  46.  
  47.         Z := s1 - s2;
  48.         IF Z < 1 THEN INC (Z,  2147483562) END(*IF*);
  49.  
  50.         RETURN scale*FLOAT(Z);
  51.  
  52.     END RANDOM;
  53.  
  54. (************************************************************************)
  55.  
  56. BEGIN
  57.     s1 := 1;  s2 := 1;
  58. END Rand.
  59.  
  60.