### TABLE OF CONTENTS

- 1. /random
- 1.1. random/Seed
- 1.2. random/resetRandom
- 1.3. random/rnExp
- 1.4. random/InitRan
- 1.5. random/initRandom
- 1.6. random/SetRandom
- 1.7. random/rn_openInterval
- 1.8. random/rn
- 1.9. random/rnFlat
- 1.10. random/rnGauss
- 1.11. random/rnCos
- 1.12. random/rnPower
- 1.13. random/rnOmega
- 1.14. random/rnOmega_anis
- 1.15. random/rnOmega_angles
- 1.16. random/rn_trueFalse
- 1.17. random/ranCharge

## /random [ Modules ]

NAME

module **random**

PURPOSE

Contains all information and routines, which are necessary for the
**random** number generation.

NOTES

Formerly we used the **random** number generator RAN3 from Numerical Recipes.
We switched to the generator "PYR" provided by Pythia, which is a rewrite
of the RANMAR routine from the Cernlib.

Contrary to the old RAN3 behaviour, the new rn() excludes the endpoints 0 and 1 !

## random/Seed [ Global module-variables ]

[ Top ] [ random ] [ Global module-variables ]

PURPOSE

Random **Seed** (used to initialize the random number generator),
accessible through the namelist 'initRandom'.
If **Seed** is zero (default), then it is set via "SYSTEM_CLOCK()".

SOURCE

integer,save ::Seed= 0

## random/resetRandom [ Global module-variables ]

[ Top ] [ random ] [ Global module-variables ]

PURPOSE

Reread random generator, used by setRandom, useful for debugging.

SOURCE

` logical,save :: `**resetRandom** = .false.

## random/rnExp [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

real function **rnExp** (A)
real function **rnExp** (A, x1, x2)

PURPOSE

Evaluates a random number x according to an exp(A*x) distribution. If given, x is restricted to lie between x1 and x2 (it doesn't matter which one of the two is larger).

INPUTS

- real :: A -- slope parameter (can be negative)
- real :: x1 -- minimal x-value
- real :: x2 -- maximal x-value

RESULT

random number

## random/InitRan [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

subroutine **InitRan**

PURPOSE

Reads random seed out of namelist 'initRandom' in jobcard and initializes the random number generator.

## random/initRandom [ Namelists ]

[ Top ] [ random ] [ Namelists ]

NAME

NAMELIST /**initRandom**/

PURPOSE

Includes the input variables:

## random/SetRandom [ Subroutines ]

[ Top ] [ random ] [ Subroutines ]

NAME

subroutine **SetRandom**

PURPOSE

write out/read random number generators

NOTES

This routine provides a shortcut for MC debugging: if an error occurs in run 12345 of 99999 runs/energy after 3 days of CPU time, the idea is to reset the random generators by reading in some files, that already run 1 reproduces this error.

In order to avoid some re-ordering of the random number lists, only in run number 3 the previously written files are read. The code stops in run 4.

## random/rn_openInterval [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

real function **rn_openInterval**()

PURPOSE

Evaluates a random number in (0,1).

USAGE

(real)=**rn_openInterval**()
Notes
Finds random number which is in [1E-8,1-1E-8], which is approximately (0,1).

## random/rn [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

real function **rn**()

PURPOSE

Evaluates a random number in (0,1).

USAGE

(real)=**rn**()

NOTES

Checks whether the random generator should be initialised, otherwise it just calls PYR. Endpoints are excluded.

## random/rnFlat [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

real function **rnFlat**(xMin,xMax)

PURPOSE

Draws a random number from a flat (uniform) distribution on (xMin,xMax).

INPUTS

- real :: xMin,xMax -- minimum and maximum value

## random/rnGauss [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

real function **rnGauss**(StdDev, Mean)

PURPOSE

evaluates a random number in according a Gauss distribution

INPUTS

- real :: StdDev -- standard deviation
- real :: Mean -- mean value of distribution

RESULT

Random number.

## random/rnCos [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

real function **rnCos**()

PURPOSE

Evaluates a random number x according to cos(x) distribution. So cos(x) is assumed to be isotropic in [-1,1]

INPUTS

- NONE

RESULT

Random number.

## random/rnPower [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

real function **rnPower** (n, xMin, xMax)

PURPOSE

Draws a random number according to a power-law distribution ~ x^n.

INPUTS

- real :: n -- exponent in power law (arbitrary real number)
- real :: xMin,xMax -- minimum and maximum value

RESULT

Random number between xMin and xMax.

## random/rnOmega [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

function **rnOmega**()

PURPOSE

Generates a unit vector with random angle (isotropical distribution).

INPUTS

- NONE

RESULT

real :: **rnOmega**(3) - random 3-dim. unit-vector

## random/rnOmega_anis [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

function **rnOmega_anis** (B)

PURPOSE

Generates a unit vector with random angle (anisotropical distribution). cos(theta) is chosen according to a probability distribution ~ 1 + B*cos**2(theta).

INPUTS

- real, intent(in) :: B --- parameter of prob. distr.

RESULT

real :: **rnOmega_anis**(3) - random 3-dim. unit-vector

## random/rnOmega_angles [ Subroutines ]

[ Top ] [ random ] [ Subroutines ]

NAME

subroutine rnOmega(theta,phi)

PURPOSE

Generates random angles theta and phi (istropical distribution) in degree.

INPUTS

- NONE

OUTPUT

- real :: theta, phi

## random/rn_trueFalse [ Functions ]

[ Top ] [ random ] [ Functions ]

NAME

function **rn_trueFalse**

PURPOSE

Gives true or false with same probability.

INPUTS

- NONE

RESULT

Logical.

## random/ranCharge [ Subroutines ]

[ Top ] [ random ] [ Subroutines ]

NAME

subroutine **ranCharge** (izmin, izmax, iztot, izout, flag)

PURPOSE

This subroutine distributes the charges randomly to a given total charge iztot.

INPUTS

- integer, intent(in) :: izmin(:) ! Vector of minimal charges
- integer, intent(in) :: izmax(:) ! Vector of maximal charges
- integer, intent(in) :: iztot ! total charge

OUTPUT

- real, dimension(:) :: izout ! Random charge configuration
- logical, intent(out) :: flag ! =.false. if procedure failed