INTERFACERandomBasic ;
Arithmetic for Modula-3, see doc for detailsAbstract: Ramdom number generators
* 3/16/96 Harry George Initial version (basic structure) 3/17/96 Warren Smith Gamma, Gaussian (Normal), and Dirichlet deviates
To do: (Lemming) - Check if the Error exception of the 'uniform' method can be catched in the procedures which make use of 'uniform' - implement Geometric, Poisson distribution
IMPORT LongRealBasic AS R, LongRealTrans AS RT, Word AS W;
FROM Arithmetic IMPORT Error;
CONST
  (*---safe boundaries for 0.0 ..  1.0 range---*)
  Min = RT.Eps * 5.0D0;
  Max = R.One - Min;
TYPE
  T <: TPublic;
  TPublic =
    OBJECT
    METHODS
      (*
          init(seed  :[FIRST(INTEGER)..-1]:=-1
                    ):T RAISES {Error};
      *)
      (* generate different types of random values, the routines may
         convert types from the actual ones of the engine behind *)
      generateBoolean (): BOOLEAN;
      generateWord    (): W.T;
      generateReal    (): R.T;
      uniform (min: R.T := Min;  (* from min *)
               max: R.T := Max;  (* to max *)
               ): R.T RAISES {Error}; (* return uniform deviate *)
      exponential (): R.T;       (* exponential, mean=1 *)
      (** Gaussian or Normal distributions have
          density = 1/sqrt(2*pi) * exp(-x*x/2).
          To get mean=m and stddeviation=s:
              value:=m + s*rand.gaussian();
      *)
      gaussian (): R.T;          (* gaussian, mean=0, var=1 *)
      gamma (a: R.T; ): R.T;
      dirichlet (p: R.Array; );
      (*
          poisson(m:R.T    (* mean *)
                 ):R.T;    (* Poisson, integer returned as real *)
      *)
      (* slow implementation *)
      binomial (p: R.T;          (* probability of successful trial *)
                n: CARDINAL;     (* number of trials *)
                ): CARDINAL;     (* number of successful trials *)
    END;
  TBoolean <: TBooleanPublic;
  TBooleanPublic = T OBJECT METHODS engine (): BOOLEAN; END;
  TWord <: TWordPublic;
  TWordPublic = T OBJECT METHODS engine (): W.T; END;
  TReal <: TRealPublic;
  TRealPublic = T OBJECT
                METHODS
                  engine (): R.T; (* raw engine; returns Min..Max *)
                END;
END RandomBasic.