ETHZ_Logo RAMSES_Logo_Right   RAMSES   RAMSES_Logo_Left Systems Ecology  
Start    search button      Modules:   A-Z   Function   Layer        QuickRefs:   DM   AuxLib   AuxLibE   SciLib   EasyMW   MW   ISIS   RMSLib

DEFINITION MODULE RandNormal;

  (*******************************************************************

    Module  RandNormal     (Version 1.0)

      Copyright (c) 1987-2006 by Andreas Fischlin and ETH Zurich.

    Purpose   Computation of normally distributed variates.

    Remarks   This implementation allows to be completely independent
              from any particular random number generator (see InstallU).
              NOTE: The module won't crash if InstallU is never called,
              but it will not produce correct results!

              References:

              Bell, J.R. 1968.  Normal random deviates.  Algorithm
                334.  Colected Algorithms from CACM (Communications
                of the Association for Computing Machinery):  334-P 1-R1.

              Box, G. & Muller, M. 1958.  A note on the generation of
                normal deviates.  Ann. Math. Stat. 28: 610.

              Von Neumann, J. 1959.  Various techniques used in
                connection with random digits.  In: Nat. Bur.
                Standards Appl. Math. Ser. 12, US GTovt. Printing Off.,
                Washington, D.C., p36.


    Programming

      o Design
        Andreas Fischlin          17/12/1987

      o Implementation
        Andreas Fischlin          17/12/1987


    ETH Zurich
    Systems Ecology
    CHN E 35.1
    Universitaetstrasse 16
    8092 Zurich
    SWITZERLAND

    URLs:
        <mailto:RAMSES@env.ethz.ch>
        <http://www.sysecol.ethz.ch>
        <http://www.sysecol.ethz.ch/SimSoftware/RAMSES>


    Last revision of definition:  22/03/1993  AF

  ******************************************************************)


  TYPE
    URandGen = PROCEDURE(): REAL;

  PROCEDURE InstallU(U: URandGen);
  (*
    Installs procedure U which returns variates
    from a random variable uniformally distributed within
    interval [0..1).  (NOTE:  Always call
    this procedure before calling N or Np).
  *)


  PROCEDURE N(): REAL;
  PROCEDURE Np(mu,stdDev: REAL): REAL;
  (*
    Return a variate from a normally distributed random variable
    with mean mu and the standard deviation stdDev.  For N these
    parameters have to be set by procedure SetPars, where the
    default values for mu respectively stdDev are 0 resp. 1.0.
    The variates are computed by the method Box and Muller
    and the Von Neumann rejection technique.

    Implementation note: Crashing of N() or Np in case where U()
    returns zero is prevented by calling U() again; however, if
    zero is an absorbing state for U() this would lead to an
    infinite loop within N() resp. Np(); hence, the implementation
    counts the occurrences of U() returning zero and halts program
    execution after 50000 occurrences.
  *)


  PROCEDURE SetPars(mu,stdDev: REAL);
  PROCEDURE GetPars(VAR mu,stdDev: REAL);
  (*
    Set or get the current parameters mu (mean) and the
    stdDev (standard deviation = SQRT(variance)) for
    the normally distributed random variable for which
    procedure N returns variates.
  *)

  PROCEDURE ResetN;
  (*
    The here adopted method (Box and Muller and the Von Neumann
    rejection) computes at each second call of N resp. Np two
    values. Inbetween the already computed and not yet used value
    is simply returned without any further calculations.  In order
    to produce completely defined results, for instance after
    setting a new seed value in the basic pseudo-random sequence
    used by U, call this procedure.  Only this will fully reset the
    internal mode of this module and put it to a state where it
    always produces the same pseudo random sequence of normally
    distributed variates.
  *)


END RandNormal.


  Contact RAMSES@env.ethz.ch Last updated: 25-Jul-2011 [Top of page]