arithmetic/src/misc/stochastic/RandomBasic.i3


INTERFACE RandomBasic;
Arithmetic for Modula-3, see doc for details

Abstract: 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.