MODULE WRandom; IMPORT Word; CONST a = 16807; m = 2147483647; q = 127773; (* m div a *) r = 2836; (* m mod a *) VAR seed : INTEGER := 12345; PROCEDURE erandom(VAR xseed : Seed) = VAR lo, hi, test : INTEGER; BEGIN hi := seed DIV q; lo := seed MOD q; test := a * lo - r * hi; IF test > 0 THEN seed := test ELSE seed := test + m; END; END erandom; (* PROCEDURE brandom(oldseed : Seed; VAR newseed : Seed; branch : INTEGER) = VAR s : Seed; BEGIN s := oldseed; s := Word.Xor(s, Word.Times(111111112, branch)); s := Word.Times(s , 7*7*7*7*7); newseed := s; END brandom; *) PROCEDURE brandom(oldseed : Seed; VAR newseed : Seed; branch : INTEGER) = VAR s : Seed; BEGIN s := oldseed; s := Word.Xor(s, Word.Times(111111112, branch)); erandom(s); newseed := s; END brandom; PROCEDURE lrandom(VAR xseed : Seed) : INTEGER = BEGIN erandom(seed); RETURN seed; END lrandom; PROCEDURE srandom(VAR xseed : Seed) : CARDINAL = (* short random -- positive, and its square fits in a CARDINAL *) BEGIN erandom(seed); RETURN Word.And(Word.RightShift(seed, 16), 16_ffff); END srandom; PROCEDURE crandom(VAR xseed : Seed) : CARDINAL = BEGIN erandom(seed); (* orig RETURN Word.And(Word.RightShift(seed, 1), 16_7fffffff); *) RETURN seed; END crandom; PROCEDURE rrandom(VAR xseed : Seed) : REAL = BEGIN erandom(seed); RETURN FLOAT(seed, REAL) / FLOAT(m, REAL) END rrandom; PROCEDURE drandom(VAR xseed : Seed) : LONGREAL = BEGIN erandom(seed); RETURN FLOAT(seed, LONGREAL) / FLOAT(m, LONGREAL) END drandom; CONST (* PROCEDURE drandom(VAR seed : Seed) : LONGREAL = VAR r : LONGREAL; VAR s : Word.T; BEGIN s := lrandom(seed); s := Word.RightShift(s, 16); s := Word.And(s, 16_ffff); r := FLOAT(s, LONGREAL) / 65536.0D0; IF r >= 1.0D0 THEN RETURN 1.0D0; END; IF r <= 0.0D0 THEN RETURN 0.0D0; END; RETURN r; END drandom; *) BEGIN END WRandom.