1993-10-09 03:08:02 +03:00
|
|
|
\" Copyright (c) 1993 Martin Birgmeier
|
|
|
|
.\" All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" You may redistribute unmodified or modified versions of this source
|
|
|
|
.\" code provided that the above copyright notice and this and the
|
|
|
|
.\" following conditions are retained.
|
|
|
|
.\"
|
|
|
|
.\" This software is provided ``as is'', and comes with no warranties
|
|
|
|
.\" of any kind. I shall in no event be liable for anything that happens
|
|
|
|
.\" to anyone/anything when using this software.
|
|
|
|
.\"
|
1994-09-17 05:01:53 +04:00
|
|
|
.\" $Id: rand48.3,v 1.2 1994/09/17 01:01:53 mycroft Exp $
|
1993-10-09 03:08:02 +03:00
|
|
|
.\"
|
|
|
|
.Dd October 8, 1993
|
|
|
|
.Dt RAND48 3
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
|
|
|
.Nm drand48 ,
|
|
|
|
.Nm erand48 ,
|
|
|
|
.Nm lrand48 ,
|
|
|
|
.Nm nrand48 ,
|
|
|
|
.Nm mrand48 ,
|
|
|
|
.Nm jrand48 ,
|
|
|
|
.Nm srand48 ,
|
|
|
|
.Nm seed48 ,
|
|
|
|
.Nm lcong48
|
|
|
|
.Nd pseudo random number generators and initialization routines
|
|
|
|
.Sh SYNOPSIS
|
|
|
|
.Fd #include <stdlib.h>
|
|
|
|
.Ft double
|
|
|
|
.Fn drand48 void
|
|
|
|
.Ft double
|
|
|
|
.Fn erand48 "unsigned short xseed[3]"
|
|
|
|
.Ft long
|
|
|
|
.Fn lrand48 void
|
|
|
|
.Ft long
|
|
|
|
.Fn nrand48 "unsigned short xseed[3]"
|
|
|
|
.Ft long
|
|
|
|
.Fn mrand48 void
|
|
|
|
.Ft long
|
|
|
|
.Fn jrand48 "unsigned short xseed[3]"
|
|
|
|
.Ft void
|
|
|
|
.Fn srand48 "long seed"
|
|
|
|
.Ft "unsigned short *"
|
|
|
|
.Fn seed48 "unsigned short xseed[3]"
|
|
|
|
.Ft void
|
|
|
|
.Fn lcong48 "unsigned short p[7]"
|
|
|
|
.Sh DESCRIPTION
|
|
|
|
The
|
|
|
|
.Fn rand48
|
|
|
|
family of functions generates pseudo-random numbers using a linear
|
|
|
|
congruential algorithm working on integers 48 bits in size. The
|
|
|
|
particular formula employed is
|
|
|
|
r(n+1) = (a * r(n) + c) mod m
|
|
|
|
where the default values are
|
|
|
|
for the multiplicand a = 0xfdeece66d = 25214903917 and
|
|
|
|
the addend c = 0xb = 11. The modulus is always fixed at m = 2 ** 48.
|
|
|
|
r(n) is called the seed of the random number generator.
|
|
|
|
.Pp
|
|
|
|
For all the six generator routines described next, the first
|
|
|
|
computational step is to perform a single iteration of the algorithm.
|
|
|
|
.Pp
|
|
|
|
.Fn drand48
|
|
|
|
and
|
|
|
|
.Fn erand48
|
|
|
|
return values of type double. The full 48 bits of r(n+1) are
|
|
|
|
loaded into the mantissa of the returned value, with the exponent set
|
|
|
|
such that the values produced lie in the interval [0.0, 1.0).
|
|
|
|
.Pp
|
|
|
|
.Fn lrand48
|
|
|
|
and
|
|
|
|
.Fn nrand48
|
|
|
|
return values of type long in the range
|
1994-09-17 05:01:53 +04:00
|
|
|
[0, 2**31-1]. The high-order (31) bits of
|
|
|
|
r(n+1) are loaded into the lower bits of the returned value, with
|
|
|
|
the topmost (sign) bit set to zero.
|
1993-10-09 03:08:02 +03:00
|
|
|
.Pp
|
|
|
|
.Fn mrand48
|
|
|
|
and
|
|
|
|
.Fn jrand48
|
|
|
|
return values of type long in the range
|
1994-09-17 05:01:53 +04:00
|
|
|
[-2**31, 2**31-1]. The high-order (32) bits of
|
|
|
|
r(n+1) are loaded into the returned value.
|
1993-10-09 03:08:02 +03:00
|
|
|
.Pp
|
|
|
|
.Fn drand48 ,
|
|
|
|
.Fn lrand48 ,
|
|
|
|
and
|
|
|
|
.Fn mrand48
|
|
|
|
use an internal buffer to store r(n). For these functions
|
|
|
|
the initial value of r(0) = 0x1234abcd330e = 20017429951246.
|
|
|
|
.Pp
|
|
|
|
On the other hand,
|
|
|
|
.Fn erand48 ,
|
|
|
|
.Fn nrand48 ,
|
|
|
|
and
|
|
|
|
.Fn jrand48
|
|
|
|
use a user-supplied buffer to store the seed r(n),
|
|
|
|
which consists of an array of 3 shorts, where the zeroth member
|
|
|
|
holds the least significant bits.
|
|
|
|
.Pp
|
|
|
|
All functions share the same multiplicand and addend.
|
|
|
|
.Pp
|
|
|
|
.Fn srand48
|
|
|
|
is used to initialize the internal buffer r(n) of
|
|
|
|
.Fn drand48 ,
|
|
|
|
.Fn lrand48 ,
|
|
|
|
and
|
|
|
|
.Fn mrand48
|
|
|
|
such that the 32 bits of the seed value are copied into the upper 32 bits
|
|
|
|
of r(n), with the lower 16 bits of r(n) arbitrarily being set to 0x330e.
|
|
|
|
Additionally, the constant multiplicand and addend of the algorithm are
|
|
|
|
reset to the default values given above.
|
|
|
|
.Pp
|
|
|
|
.Fn seed48
|
|
|
|
also initializes the internal buffer r(n) of
|
|
|
|
.Fn drand48 ,
|
|
|
|
.Fn lrand48 ,
|
|
|
|
and
|
|
|
|
.Fn mrand48 ,
|
|
|
|
but here all 48 bits of the seed can be specified in an array of 3 shorts,
|
|
|
|
where the zeroth member specifies the lowest bits. Again,
|
|
|
|
the constant multiplicand and addend of the algorithm are
|
|
|
|
reset to the default values given above.
|
|
|
|
.Fn seed48
|
|
|
|
returns a pointer to an array of 3 shorts which contains the old seed.
|
|
|
|
This array is statically allocated, thus its contents are lost after
|
|
|
|
each new call to
|
|
|
|
.Fn seed48 .
|
|
|
|
.Pp
|
|
|
|
Finally,
|
|
|
|
.Fn lcong48
|
|
|
|
allows full control over the multiplicand and addend used in
|
|
|
|
.Fn drand48 ,
|
|
|
|
.Fn erand48 ,
|
|
|
|
.Fn lrand48 ,
|
|
|
|
.Fn nrand48 ,
|
|
|
|
.Fn mrand48 ,
|
|
|
|
and
|
|
|
|
.Fn jrand48 ,
|
|
|
|
and the seed used in
|
|
|
|
.Fn drand48 ,
|
|
|
|
.Fn lrand48 ,
|
|
|
|
and
|
|
|
|
.Fn mrand48 .
|
|
|
|
An array of 7 shorts is passed as parameter; the first three shorts are
|
|
|
|
used to initialize the seed; the second three are used to initialize the
|
|
|
|
multiplicand; and the last short is used to initialize the addend.
|
|
|
|
It is thus not possible to use values greater than 0xffff as the addend.
|
|
|
|
.Pp
|
|
|
|
Note that all three methods of seeding the random number generator
|
|
|
|
always also set the multiplicand and addend for any of the six
|
|
|
|
generator calls.
|
|
|
|
.Pp
|
|
|
|
For a more powerful random number generator, see
|
|
|
|
.Xr random 3
|
|
|
|
.Sh AUTHOR
|
|
|
|
Martin Birgmeier
|
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr rand 3 ,
|
|
|
|
.Xr random 3 .
|