119 lines
4.0 KiB
Groff
119 lines
4.0 KiB
Groff
|
||
|
||
RANDOM(3) Minix Programmer's Manual RANDOM(3)
|
||
|
||
|
||
NAME
|
||
random, srandom, initstate, setstate - better random number generator;
|
||
routines for changing generators
|
||
|
||
SYNOPSIS
|
||
#include <stdlib.h>
|
||
|
||
long random(void)
|
||
void srandom(unsigned seed)
|
||
char *initstate(unsigned seed, char *state, int n)
|
||
char *setstate(char *state)
|
||
|
||
DESCRIPTION
|
||
|
||
Random uses a non-linear additive feedback random number generator
|
||
employing a default table of size 31 long integers to return successive
|
||
pseudo-random numbers in the range from 0 to (2**31)-1. The period of
|
||
this random number generator is very large, approximately 16*((2**31)-1).
|
||
|
||
Random/srandom have (almost) the same calling sequence and initialization
|
||
properties as rand/srand. The difference is that rand(3) produces a much
|
||
less random sequence -- in fact, the low dozen bits generated by rand go
|
||
through a cyclic pattern. All the bits generated by random are usable.
|
||
For example, ``random()&01'' will produce a random binary value.
|
||
|
||
Unlike srand, srandom does not return the old seed; the reason for this
|
||
is that the amount of state information used is much more than a single
|
||
word. (Two other routines are provided to deal with restarting/changing
|
||
random number generators). Like rand(3), however, random will by default
|
||
produce a sequence of numbers that can be duplicated by calling srandom
|
||
with 1 as the seed.
|
||
|
||
The initstate routine allows a state array, passed in as an argument, to
|
||
be initialized for future use. The size of the state array (in bytes) is
|
||
used by initstate to decide how sophisticated a random number generator
|
||
it should use -- the more state, the better the random numbers will be.
|
||
(Current "optimal" values for the amount of state information are 8, 32,
|
||
64, 128, and 256 bytes; other amounts will be rounded down to the nearest
|
||
known amount. Using less than 8 bytes will cause an error). The seed
|
||
for the initialization (which specifies a starting point for the random
|
||
number sequence, and provides for restarting at the same point) is also
|
||
an argument. Initstate returns a pointer to the previous state
|
||
information array.
|
||
|
||
Once a state has been initialized, the setstate routine provides for
|
||
rapid switching between states. Setstate returns a pointer to the
|
||
previous state array; its argument state array is used for further random
|
||
number generation until the next call to initstate or setstate.
|
||
|
||
|
||
|
||
|
||
5BSD September 29, 1985 1
|
||
|
||
|
||
|
||
RANDOM(3) Minix Programmer's Manual RANDOM(3)
|
||
|
||
|
||
Once a state array has been initialized, it may be restarted at a
|
||
different point either by calling initstate (with the desired seed, the
|
||
state array, and its size) or by calling both setstate (with the state
|
||
array) and srandom (with the desired seed). The advantage of calling
|
||
both setstate and srandom is that the size of the state array does not
|
||
have to be remembered after it is initialized.
|
||
|
||
With 256 bytes of state information, the period of the random number
|
||
generator is greater than 2**69 which should be sufficient for most
|
||
purposes.
|
||
|
||
AUTHOR
|
||
Earl T. Cohen
|
||
|
||
DIAGNOSTICS
|
||
|
||
If initstate is called with less than 8 bytes of state information, or if
|
||
setstate detects that the state information has been garbled, error
|
||
messages are printed on the standard error output.
|
||
|
||
SEE ALSO
|
||
rand(3).
|
||
|
||
NOTES
|
||
initstate and setstate are not declared in <stdlib.h>, programmers must
|
||
provide their own declarations.
|
||
|
||
BUGS
|
||
About 2/3 the speed of rand(3).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
5BSD September 29, 1985 2
|
||
|