RNUN

Generates pseudorandom numbers from a uniform (0, 1) distribution.

Required Arguments

R — Vector of length NR containing the random uniform (0, 1) deviates. (Output)

Optional Arguments

NR — Number of random numbers to generate. (Input)

Default: NR = size (R,1).

Default: NR = size (R,1).

FORTRAN 90 Interface

Generic: CALL RNUN (R [, …])

Specific: The specific interface names are S_RNUN and D_RNUN.

FORTRAN 77 Interface

Single: CALL RNUN (NR, R)

Double: The double precision name is DRNUN.

Description

Routine RNUN generates pseudorandom numbers from a uniform (0,1) distribution using either a multiplicative congruential method or a generalized feedback shift register (GFSR) method, or the Mersenne Twister generator. The form of the multiplicative congruential generator is

Each xi is then scaled into the unit interval (0,1). The possible values for c in the IMSL generators are 16807, 397204094, and 950706376. The selection is made by the routine RNOPT. The choice of 16807 will result in the fastest execution time. If no selection is made explicitly, the routines use the multiplier 16807.

The user can also select a shuffled version of the multiplicative congruential generators. In this scheme, a table is filled with the first 128 uniform (0,1) numbers resulting from the simple multiplicative congruential generator. Then, for each xi from the simple generator, the low-order bits of xi are used to select a random integer, j, from 1 to 128. The j-th entry in the table is then delivered as the random number; and xi, after being scaled into the unit interval, is inserted into the j-th position in the table.

The GFSR method is based on the recursion Xt = Xt‑1563 ⊕ Xt‑96. This generator, which is different from earlier GFSR generators, was proposed by Fushimi (1990), who discusses the theory behind the generator and reports on several empirical tests of it.

Mersenne Twister(MT) is a pseudorandom number generating algorithm developed by Makoto Matsumoto and Takuji Nishimura in 1996-1997. MT has far longer period and far higher order of equidistribution than any other implemented generators. The values returned in R by RNUN are positive and less than 1.0. Values in R may be smaller than the smallest relative spacing, however. Hence, it may be the case that some value R(i) is such that 1.0 ‑ R(i) = 1.0.

Deviates from the distribution with uniform density over the interval (A, B) can be obtained by scaling the output from RNUN. The following statements (in single precision) would yield random deviates from a uniform (A, B) distribution:

CALL RNUN (NR, R)

CALL SSCAL (NR, B-A, R, 1)

CALL SADD (NR, A, R, 1)

CALL SSCAL (NR, B-A, R, 1)

CALL SADD (NR, A, R, 1)

Comments

1. The routine RNSET can be used to initialize the seed of the random number generator. The routine RNOPT can be used to select the form of the generator.

Example

In this example, RNUN is used to generate five pseudorandom uniform numbers. Since RNOPT is not called, the generator used is a simple multiplicative congruential one with a multiplier of 16807.

USE RNUN_INT

USE RNSET_INT

USE UMACH_INT

IMPLICIT NONE

INTEGER ISEED, NOUT, NR

REAL R(5)

!

CALL UMACH (2, NOUT)

NR = 5

ISEED = 123457

CALL RNSET (ISEED)

CALL RNUN (R)

WRITE (NOUT,99999) R

99999 FORMAT (' Uniform random deviates: ', 5F8.4)

END

Output

Uniform random deviates: 0.9662 0.2607 0.7663 0.5693 0.8448