From bd3b90d6b66049cf93ef36ab4ac0af01f0b287d6 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Thu, 31 Oct 2013 20:39:37 +0400 Subject: [PATCH] ported RandomNumbers --- makefile | 1 + src/lib/s3/RandomNumbers.Mod | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/lib/s3/RandomNumbers.Mod diff --git a/makefile b/makefile index e13048a7..a356065c 100644 --- a/makefile +++ b/makefile @@ -212,6 +212,7 @@ stage6: $(VOCSTATIC) -sP ZlibReaders.Mod $(VOCSTATIC) -sP ZlibWriters.Mod $(VOCSTATIC) -sP Zip.Mod + $(VOCSTATIC) -sP RandomNumbers.Mod stage7: diff --git a/src/lib/s3/RandomNumbers.Mod b/src/lib/s3/RandomNumbers.Mod new file mode 100644 index 00000000..5526672a --- /dev/null +++ b/src/lib/s3/RandomNumbers.Mod @@ -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 *)