(*
     $RCSfile: RandomNumbers.mod $
  Description: Random number generator from "Programming In Oberon"

   Created by: fjc (Frank Copeland)
    $Revision: 1.4 $
      $Author: fjc $
        $Date: 1994/08/08 16:40:04 $

  Copyright © 1990-1993, ETH Zuerich
  Copyright © 1994, Frank Copeland.
  This file is part of the Oberon-A Library.
  See Oberon-A.doc for conditions of use and distribution.
*)

MODULE RandomNumbers;

(*
** $C= CaseChk       $I= IndexChk  $L+ LongAdr   $N= NilChk
** $P= PortableCode  $R= RangeChk  $S= StackChk  $T= TypeChk
** $V= OvflChk       $Z= ZeroVars
*)

IMPORT Dos;

VAR z : LONGINT;

(*------------------------------------*)
PROCEDURE Uniform * () : REAL;

  CONST a = 16807; m = 2147483647; q = m DIV a; r = m MOD a;

  VAR gamma : LONGINT;

BEGIN (* Uniform *)
  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)
END Uniform;

(*------------------------------------*)
PROCEDURE InitSeed * (seed : LONGINT);

BEGIN (* InitSeed *)
  z := seed
END InitSeed;

(*------------------------------------*)
PROCEDURE TimeSeed * ();

  VAR ds : Dos.Date; x : REAL;

BEGIN (* TimeSeed *)
  Dos.base.DateStamp (ds);
  z := (ds.minute * (60 * Dos.ticksPerSecond)) + ds.tick;
  x := Uniform()
END TimeSeed;

BEGIN
  z := 314159
END RandomNumbers.
