ack/lang/m2/libm2/random.mod
1988-02-19 16:36:45 +00:00

48 lines
954 B
Modula-2

(*
(c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
See the copyright notice in the ACK home directory, in the file "Copyright".
*)
(*$R-*)
IMPLEMENTATION MODULE random;
(*
Module: random numbers
Author: Ceriel J.H. Jacobs
Version: $Header$
*)
FROM Unix IMPORT getpid, time;
TYPE index = [0..54];
VAR X: ARRAY index OF CARDINAL;
k, j: index;
PROCEDURE Random(): CARDINAL;
BEGIN
IF k+1 > 54 THEN k := 0; ELSE INC(k) END;
IF j+1 > 54 THEN j := 0; ELSE INC(j) END;
X[k] := X[k] + X[j];
RETURN X[k]
END Random;
PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL;
BEGIN
IF upb <= lwb THEN RETURN lwb; END;
RETURN lwb + (Random() MOD (upb - lwb + 1));
END Uniform;
PROCEDURE StartSeed(seed: CARDINAL);
BEGIN
X[0] := seed;
FOR k := 1 TO 54 DO
X[k] := X[k-1] * 1297;
END;
k := 54;
j := 30;
END StartSeed;
BEGIN
X[0] := time(NIL);
StartSeed(CARDINAL(getpid()) * X[0]);
END random.