RANDOM(3) UNIX Programmer's Manual RANDOM(3) NAME random, srandom, initstate, setstate - better random number generator; routines for changing generators SYNOPSIS long random() srandom(seed) int seed; char *initstate(seed, state, n) unsigned seed; char *state; int n; char *setstate(state) char *state; DESCRIPTION _R_a_n_d_o_m 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). _R_a_n_d_o_m/_s_r_a_n_d_o_m have (almost) the same calling sequence and initialization properties as _r_a_n_d/_s_r_a_n_d. The difference is that _r_a_n_d(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 _r_a_n_d_o_m are usable. For example, ``random()&01'' will produce a random binary value. Unlike _s_r_a_n_d, _s_r_a_n_d_o_m does not return the old seed; the rea- son for this is that the amount of state information used is much more than a single word. (Two other routines are pro- vided to deal with restarting/changing random number genera- tors). Like _r_a_n_d(3), however, _r_a_n_d_o_m will by default pro- duce a sequence of numbers that can be duplicated by calling _s_r_a_n_d_o_m with _1 as the seed. The _i_n_i_t_s_t_a_t_e 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 _i_n_i_t_s_t_a_t_e 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. _I_n_i_t_s_t_a_t_e returns a pointer to the Printed 11/26/99 September 29, 1985 1 RANDOM(3) UNIX Programmer's Manual RANDOM(3) previous state information array. Once a state has been initialized, the _s_e_t_s_t_a_t_e routine pro- vides for rapid switching between states. _S_e_t_s_t_a_t_e returns a pointer to the previous state array; its argument state array is used for further random number generation until the next call to _i_n_i_t_s_t_a_t_e or _s_e_t_s_t_a_t_e. Once a state array has been initialized, it may be restarted at a different point either by calling _i_n_i_t_s_t_a_t_e (with the desired seed, the state array, and its size) or by calling both _s_e_t_s_t_a_t_e (with the state array) and _s_r_a_n_d_o_m (with the desired seed). The advantage of calling both _s_e_t_s_t_a_t_e and _s_r_a_n_d_o_m 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. AUTHOR Earl T. Cohen DIAGNOSTICS If _i_n_i_t_s_t_a_t_e is called with less than 8 bytes of state information, or if _s_e_t_s_t_a_t_e detects that the state informa- tion has been garbled, error messages are printed on the standard error output. SEE ALSO rand(3) BUGS About 2/3 the speed of _r_a_n_d(3C). Printed 11/26/99 September 29, 1985 2