random(3)
NAME
- random, srandom, srandomdev, initstate, setstate - better
- random number
generator; routines for changing generators
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <stdlib.h> long random(void); void srandom(unsigned long seed); void srandomdev(void); char * initstate(unsigned long seed, char *state, long n); char * setstate(char *state);
DESCRIPTION
- The random() function 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, ap - proximately
16*((2**31)-1). - The random() and srandom() functions have (almost) the same
- calling
sequence and initialization properties as the rand(3) and - srand(3) functions. 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 us - able. For
example, `random()&01' will produce a random binary value. - Like rand(3), random() will by default produce a sequence of
- numbers that
can be duplicated by calling srandom() with `1' as the seed. - The srandomdev() routine initializes a state array using the
- random(4)
random number device which returns good random numbers, - suitable for
cryptographic use. Note that this particular seeding proce - dure can generate states which are impossible to reproduce by calling
- srandom() with
any value, since the succeeding terms in the state buffer - are no longer
derived from the LC algorithm applied to a fixed seed. - The initstate() routine allows a state array, passed in as
- an argument,
to be initialized for future use. The size of the state ar - ray (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 in - formation 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. The initstate() function returns a point - er to the previous state information array.
- Once a state has been initialized, the setstate() routine
- provides for
rapid switching between states. The setstate() function re - turns a
pointer to the previous state array; its argument state ar - ray is used for
further random number generation until the next call to - initstate() or
setstate(). - 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 ran
- dom number generator is greater than 2**69 which should be sufficient for
- most purposes.
DIAGNOSTICS
- If initstate() is called with less than 8 bytes of state in
- formation, or
if setstate() detects that the state information has been - garbled, error
messages are printed on the standard error output.
SEE ALSO
arc4random(3), rand(3), srand(3), random(4)
HISTORY
These functions appeared in 4.2BSD.
AUTHORS
Earl T. Cohen
BUGS
About 2/3 the speed of rand(3).
- The historical implementation used to have a very weak seed
- ing; the random sequence did not vary much with the seed. The current
- implementation
employs a better pseudo-random number generator for the ini - tial state
calculation. - Applications requiring cryptographic quality randomness
- should use
arc4random(3). - BSD June 4, 1993