(*********************************************************************)
(* Title:	Random - Implementation				     *)
(* Author: 	Jeremy Dion     				     *)
(*********************************************************************)


(*
  $Revision: 1.2 $
  $Author: mjj $
  $Date: 85/07/04 10:03:18 $
  $Source: /util/m2/lib/Standard/RCS/Random.mod,v $
  $State: Exp $
*)

IMPLEMENTATION MODULE Random;
(* $T- *)

VAR fibonacci: ARRAY BOOLEAN OF CARDINAL;
VAR b: BOOLEAN;

PROCEDURE Seed (c: CARDINAL);
BEGIN
    fibonacci [b] := c;
    b := NOT b;
END Seed;

PROCEDURE RandomCard(): CARDINAL;
BEGIN
    fibonacci [b] := fibonacci [TRUE] + fibonacci [FALSE];
    b := NOT b;
    RETURN fibonacci [b];
END RandomCard;

PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL;
BEGIN
    IF upb <= lwb THEN
        RETURN lwb
    ELSE RETURN (RandomCard () MOD (upb - lwb + 1)) + lwb;
    END;
END Uniform;

PROCEDURE ZeroTo (l: CARDINAL): CARDINAL;
BEGIN
    RETURN Uniform (0, l);
END ZeroTo;

PROCEDURE OneTo (l: CARDINAL): CARDINAL;
BEGIN
    RETURN Uniform (1, l);
END OneTo;

BEGIN
    b := FALSE;
    fibonacci [FALSE] := 214376922;
    fibonacci [TRUE] := 436098648;
END Random.

(*
$Log:	Random.mod,v $
Revision 1.2  85/07/04  10:03:18  mjj
Remove unnecessary range checking.

*)

