drand48
Purpose
Generates uniformly distributed pseudo-random number
sequences.
Library
Standard C Library (libc.a)
Syntax
double drand48 ( ) long jrand48 (xsubi)
unsigned short xsubi[3|;
double erand48 (xsubi)
unsigned short xsubi[3|; void srand48 (seedval)
long seedval;
long lrand48 ( )
unsigned short *seed48 (seed16v)
long nrand48 (xsubi) unsigned short seed16v[3|;
unsigned short xsubi[3|;
void lcong48 (param)
long mrand48 ( ); unsigned short param[7|;
Description
This family of subroutines generates pseudo-random
numbers using the linear congruential algorithm and
48-bit integer arithmetic.
The drand48 and erand48 subroutines return nonnegative
double-precision floating-point values uniformly distrib-
uted over the range of y values such that 0.0 < y < 1.0.
The lrand48 and nrand48 subroutines return nonnegative
long integers uniformly distributed over the range of y
values such that 0 < y < 2(31).
The mrand48 and jrand48 subroutines return signed long
integers uniformly distributed over the range of y values
such that -2(31) < y < 2(31).
The srand48, seed48 and lcong48 subroutines initialize,
the random-number generator. Programs should invoke one
of them before calling drand48, lrand48 or mrand48.
(Although it is not recommended practice, constant
default initializer values are supplied automatically if
the drand48, lrand48 or mrand48 subroutines are called
without first calling an initialization subroutine.) The
erand48, nrand48 and jrand48 subroutines do not require
that an initialization subroutine to be called first.
All the subroutines work by generating a sequence of
48-bit integer values, X[i], according to the linear
congruential formula:
X sub <n + 1> = (aX sub n + c) sub <mod m> %%%% n ge 0
The parameter m = 2(48); hence 48-bit integer arithmetic
is performed. Unless the lcong48 subroutine has been
called, the multiplier value a and the addend value c
are:
a = '5DEECE66D' sub 16 = '273673163155' sub 8
c = 'B' sub 16 = '13' sub 8
The value returned by the drand48, erand48, lrand48,
nrand48, mrand48, and jrand48 subroutines is computed by
first generating the next 48-bit X[i] in the sequence.
Then the appropriate number of bits, according to the
type of data item to be returned, are copied from the
high-order (most significant) bits of X[i] and trans-
formed into the returned value.
The drand48, lrand48 and mrand48 subroutines store the
last 48-bit X[i] generated into an internal buffer; that
is why they must be initialized prior to being invoked.
The erand48, nrand48 and jrand48 subroutines require the
calling program to provide storage for the successive
X[i] values in the array pointed to by the xsubi param-
eter. That is why these routines do not have to be ini-
tialized; the calling program merely has to place the
desired initial value of X[i] into the array and pass it
as a parameter.
By using different parameters, the erand48, nrand48, and
jrand48 subroutines allow separate modules of a large
program to generate several independent sequences of
pseudo-random numbers. In other words, the sequence of
numbers that one module generates does not depend upon
how many times the subroutines are called by other
modules.
The initializer subroutine srand48 sets the high-order 32
bits of X[i] to the 32 bits contained in its parameter.
The low order 16 bits of X[i] are set to the arbitrary
value 330E[16].
The initializer subroutine seed48 sets the value of X[i]
to the 48-bit value specified in the array pointed to by
the seed16v parameter. In addition, seed48 returns a
pointer to a 48-bit internal buffer that contains the
previous value of X[i]. that is used only by seed48.
The returned pointer allows you to restart the pseudo-
random sequence at a given point. Use the pointer to
copy the previous X[i] value into a temporary array.
Later you can call seed48 with a pointer to this array to
resume where the original sequence left off.
The lcong48 subroutine specifies the initial X[i] value,
the multiplier value a, and the addend value c. The
parameter array elements param[0-2] specify X[i],
param[3-5] specify the multiplier a, and param[6] speci-
fies the 16-bit addend c. After lcong48 has been called,
a subsequent call to either srand48 or seed48 restores
the standard a and c as specified previously.
Related Information
In this book: "rand, srand."