ported RandomNumbers

This commit is contained in:
Norayr Chilingarian 2013-10-31 20:39:37 +04:00
parent fcc5f1447d
commit bd3b90d6b6
2 changed files with 41 additions and 0 deletions

View file

@ -212,6 +212,7 @@ stage6:
$(VOCSTATIC) -sP ZlibReaders.Mod
$(VOCSTATIC) -sP ZlibWriters.Mod
$(VOCSTATIC) -sP Zip.Mod
$(VOCSTATIC) -sP RandomNumbers.Mod
stage7:

View file

@ -0,0 +1,40 @@
(* ETH Oberon, Copyright 2001 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
MODULE RandomNumbers; (** portable *)
(* Random Number Generator, page 12 *)
IMPORT Math := oocOakMath, Oberon := Kernel, SYSTEM;
VAR Z, t, d: LONGINT;
(** Return a uniform random number r, with 0 < r < 1. *)
PROCEDURE Uniform*(): REAL;
CONST
a = 16807; m = 2147483647;
q = m DIV a; r = m MOD a;
VAR g: LONGINT;
BEGIN
g := a*(Z MOD q) - r*(Z DIV q);
IF g > 0 THEN Z := g ELSE Z := g + m END;
RETURN SHORT(Z*1.0D0/m) (* must compute this in double precision, e.g. (m-1)/m *)
END Uniform;
(** Return an exponentially distributed random number r. *)
PROCEDURE Exp*(mu: REAL): REAL;
BEGIN
RETURN -Math.ln(Uniform())/mu
END Exp;
(** Initialize the random number seed. *)
PROCEDURE InitSeed*(seed: LONGINT);
BEGIN
Z := seed
END InitSeed;
BEGIN
Oberon.GetClock(t, d);
Z := SYSTEM.VAL(LONGINT, SYSTEM.VAL(SET, t) / SYSTEM.VAL(SET, d))
END RandomNumbers. (* Copyright M. Reiser, 1992 *)