MODULE ObxRandom;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   references   = "Martin Reiser, Niklaus Wirth, Programming In Oberon, ISBN 0201565439"
   changes   = ""
   issues   = ""

**)

   VAR z: INTEGER;   (* global variable *)

   PROCEDURE Uniform* (): REAL;

      CONST a = 16807; m = 2147483647; q = m DIV a; r = m MOD a;
      VAR gamma: INTEGER;
   BEGIN
      gamma := a * (z MOD q) - r * (z DIV q);
      IF gamma > 0 THEN
         z := gamma
      ELSE
         z := gamma + m
      END;
      RETURN z * (1.0 / m)   (* value of the function *)
   END Uniform;
   PROCEDURE InitSeed* (seed: INTEGER);

   BEGIN
      z := seed
   END InitSeed;
BEGIN

   z := 314159   (* initial value of seed *)
END ObxRandom.