[9] | 1 | .\" Copyright (c) 1983 Regents of the University of California.
|
---|
| 2 | .\" All rights reserved. The Berkeley software License Agreement
|
---|
| 3 | .\" specifies the terms and conditions for redistribution.
|
---|
| 4 | .\"
|
---|
| 5 | .\" @(#)random.3 6.2 (Berkeley) 9/29/85
|
---|
| 6 | .\"
|
---|
| 7 | .TH RANDOM 3 "September 29, 1985"
|
---|
| 8 | .UC 5
|
---|
| 9 | .SH NAME
|
---|
| 10 | random, srandom, initstate, setstate \- better random number generator; routines for changing generators
|
---|
| 11 | .SH SYNOPSIS
|
---|
| 12 | .nf
|
---|
| 13 | .ft B
|
---|
| 14 | #include <stdlib.h>
|
---|
| 15 |
|
---|
| 16 | long random(void)
|
---|
| 17 | void srandom(unsigned \fIseed\fP)
|
---|
| 18 | char *initstate(unsigned \fIseed\fP, char *\fIstate\fP, int \fIn\fP)
|
---|
| 19 | char *setstate(char *\fIstate\fP)
|
---|
| 20 | .ft R
|
---|
| 21 | .fi
|
---|
| 22 | .SH DESCRIPTION
|
---|
| 23 | .PP
|
---|
| 24 | .B Random
|
---|
| 25 | uses a non-linear additive feedback random number generator employing a
|
---|
| 26 | default table of size 31 long integers to return successive pseudo-random
|
---|
| 27 | numbers in the range from 0 to
|
---|
| 28 | .if t 2\u\s731\s10\d\(mi1.
|
---|
| 29 | .if n (2**31)\(mi1.
|
---|
| 30 | The period of this random number generator is very large, approximately
|
---|
| 31 | .if t 16\(mu(2\u\s731\s10\d\(mi1).
|
---|
| 32 | .if n 16*((2**31)\(mi1).
|
---|
| 33 | .PP
|
---|
| 34 | .B Random/srandom
|
---|
| 35 | have (almost) the same calling sequence and initialization properties as
|
---|
| 36 | .B rand/srand.
|
---|
| 37 | The difference is that
|
---|
| 38 | .BR rand (3)
|
---|
| 39 | produces a much less random sequence \(em in fact, the low dozen bits
|
---|
| 40 | generated by rand go through a cyclic pattern. All the bits generated by
|
---|
| 41 | .B random
|
---|
| 42 | are usable. For example, ``random()&01'' will produce a random binary
|
---|
| 43 | value.
|
---|
| 44 | .PP
|
---|
| 45 | Unlike
|
---|
| 46 | .BR srand ,
|
---|
| 47 | .B srandom
|
---|
| 48 | does not return the old seed; the reason for this is that the amount of
|
---|
| 49 | state information used is much more than a single word. (Two other
|
---|
| 50 | routines are provided to deal with restarting/changing random
|
---|
| 51 | number generators). Like
|
---|
| 52 | .BR rand (3),
|
---|
| 53 | however,
|
---|
| 54 | .B random
|
---|
| 55 | will by default produce a sequence of numbers that can be duplicated
|
---|
| 56 | by calling
|
---|
| 57 | .B srandom
|
---|
| 58 | with
|
---|
| 59 | .B 1
|
---|
| 60 | as the seed.
|
---|
| 61 | .PP
|
---|
| 62 | The
|
---|
| 63 | .B initstate
|
---|
| 64 | routine allows a state array, passed in as an argument, to be initialized
|
---|
| 65 | for future use. The size of the state array (in bytes) is used by
|
---|
| 66 | .B initstate
|
---|
| 67 | to decide how sophisticated a random number generator it should use -- the
|
---|
| 68 | more state, the better the random numbers will be.
|
---|
| 69 | (Current "optimal" values for the amount of state information are
|
---|
| 70 | 8, 32, 64, 128, and 256 bytes; other amounts will be rounded down to
|
---|
| 71 | the nearest known amount. Using less than 8 bytes will cause an error).
|
---|
| 72 | The seed for the initialization (which specifies a starting point for
|
---|
| 73 | the random number sequence, and provides for restarting at the same
|
---|
| 74 | point) is also an argument.
|
---|
| 75 | .B Initstate
|
---|
| 76 | returns a pointer to the previous state information array.
|
---|
| 77 | .PP
|
---|
| 78 | Once a state has been initialized, the
|
---|
| 79 | .B setstate
|
---|
| 80 | routine provides for rapid switching between states.
|
---|
| 81 | .B Setstate
|
---|
| 82 | returns a pointer to the previous state array; its
|
---|
| 83 | argument state array is used for further random number generation
|
---|
| 84 | until the next call to
|
---|
| 85 | .B initstate
|
---|
| 86 | or
|
---|
| 87 | .BR setstate .
|
---|
| 88 | .PP
|
---|
| 89 | Once a state array has been initialized, it may be restarted at a
|
---|
| 90 | different point either by calling
|
---|
| 91 | .B initstate
|
---|
| 92 | (with the desired seed, the state array, and its size) or by calling
|
---|
| 93 | both
|
---|
| 94 | .B setstate
|
---|
| 95 | (with the state array) and
|
---|
| 96 | .B srandom
|
---|
| 97 | (with the desired seed).
|
---|
| 98 | The advantage of calling both
|
---|
| 99 | .B setstate
|
---|
| 100 | and
|
---|
| 101 | .B srandom
|
---|
| 102 | is that the size of the state array does not have to be remembered after
|
---|
| 103 | it is initialized.
|
---|
| 104 | .PP
|
---|
| 105 | With 256 bytes of state information, the period of the random number
|
---|
| 106 | generator is greater than
|
---|
| 107 | .if t 2\u\s769\s10\d,
|
---|
| 108 | .if n 2**69
|
---|
| 109 | which should be sufficient for most purposes.
|
---|
| 110 | .SH AUTHOR
|
---|
| 111 | Earl T. Cohen
|
---|
| 112 | .SH DIAGNOSTICS
|
---|
| 113 | .PP
|
---|
| 114 | If
|
---|
| 115 | .B initstate
|
---|
| 116 | is called with less than 8 bytes of state information, or if
|
---|
| 117 | .B setstate
|
---|
| 118 | detects that the state information has been garbled, error
|
---|
| 119 | messages are printed on the standard error output.
|
---|
| 120 | .SH "SEE ALSO"
|
---|
| 121 | .BR rand (3).
|
---|
| 122 | .SH NOTES
|
---|
| 123 | .B initstate
|
---|
| 124 | and
|
---|
| 125 | .B setstate
|
---|
| 126 | are not declared in
|
---|
| 127 | .IR <stdlib.h> ,
|
---|
| 128 | programmers must provide their own declarations.
|
---|
| 129 | .SH BUGS
|
---|
| 130 | About 2/3 the speed of
|
---|
| 131 | .BR rand (3).
|
---|