random.mod 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. (*
  2. (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. See the copyright notice in the ACK home directory, in the file "Copyright".
  4. *)
  5. (*$R-*)
  6. IMPLEMENTATION MODULE random;
  7. (*
  8. Module: random numbers
  9. Author: Ceriel J.H. Jacobs
  10. Version: $Id$
  11. *)
  12. FROM Unix IMPORT getpid, time;
  13. TYPE index = [1..55];
  14. VAR X: ARRAY index OF CARDINAL;
  15. j, k: index;
  16. tm: LONGINT;
  17. PROCEDURE Random(): CARDINAL;
  18. BEGIN
  19. IF k-1 <= 0 THEN k := 55; ELSE DEC(k) END;
  20. IF j-1 <= 0 THEN j := 55; ELSE DEC(j) END;
  21. X[k] := X[k] + X[j];
  22. RETURN X[k]
  23. END Random;
  24. PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL;
  25. BEGIN
  26. IF upb <= lwb THEN RETURN lwb; END;
  27. RETURN lwb + (Random() MOD (upb - lwb + 1));
  28. END Uniform;
  29. PROCEDURE StartSeed(seed: CARDINAL);
  30. VAR v: CARDINAL;
  31. BEGIN
  32. FOR k := 1 TO 55 DO
  33. seed := 1297 * seed + 123;
  34. X[k] := seed;
  35. END;
  36. FOR k := 1 TO 15 DO
  37. j := tm MOD 55D + 1D;
  38. v := X[j];
  39. tm := tm DIV 7D;
  40. j := tm MOD 55D + 1D;
  41. X[j] := v;
  42. tm := tm * 3D;
  43. END;
  44. k := 1;
  45. j := 25;
  46. END StartSeed;
  47. BEGIN
  48. tm := time(NIL);
  49. X[1] := tm;
  50. StartSeed(CARDINAL(getpid()) * X[1]);
  51. END random.