132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .\" Copyright (c) 1983 Regents of the University of California.
 | |
| .\" All rights reserved.  The Berkeley software License Agreement
 | |
| .\" specifies the terms and conditions for redistribution.
 | |
| .\"
 | |
| .\"	@(#)random.3	6.2 (Berkeley) 9/29/85
 | |
| .\"
 | |
| .TH RANDOM 3 "September 29, 1985"
 | |
| .UC 5
 | |
| .SH NAME
 | |
| random, srandom, initstate, setstate \- better random number generator; routines for changing generators
 | |
| .SH SYNOPSIS
 | |
| .nf
 | |
| .ft B
 | |
| #include <stdlib.h>
 | |
| 
 | |
| long random(void)
 | |
| void srandom(unsigned \fIseed\fP)
 | |
| char *initstate(unsigned \fIseed\fP, char *\fIstate\fP, int \fIn\fP)
 | |
| char *setstate(char *\fIstate\fP)
 | |
| .ft R
 | |
| .fi
 | |
| .SH DESCRIPTION
 | |
| .PP
 | |
| .B 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
 | |
| .if t 2\u\s731\s10\d\(mi1.
 | |
| .if n (2**31)\(mi1.
 | |
| The period of this random number generator is very large, approximately
 | |
| .if t 16\(mu(2\u\s731\s10\d\(mi1).
 | |
| .if n 16*((2**31)\(mi1).
 | |
| .PP
 | |
| .B Random/srandom
 | |
| have (almost) the same calling sequence and initialization properties as
 | |
| .B rand/srand.
 | |
| The difference is that
 | |
| .BR rand (3)
 | |
| produces a much less random sequence \(em in fact, the low dozen bits
 | |
| generated by rand go through a cyclic pattern.  All the bits generated by
 | |
| .B random
 | |
| are usable.  For example, ``random()&01'' will produce a random binary
 | |
| value.
 | |
| .PP
 | |
| Unlike
 | |
| .BR srand ,
 | |
| .B 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
 | |
| .BR rand (3),
 | |
| however,
 | |
| .B random
 | |
| will by default produce a sequence of numbers that can be duplicated
 | |
| by calling
 | |
| .B srandom
 | |
| with 
 | |
| .B 1
 | |
| as the seed.
 | |
| .PP
 | |
| The
 | |
| .B 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
 | |
| .B 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.
 | |
| .B Initstate
 | |
| returns a pointer to the previous state information array.
 | |
| .PP
 | |
| Once a state has been initialized, the
 | |
| .B setstate
 | |
| routine provides for rapid switching between states.
 | |
| .B 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
 | |
| .B initstate
 | |
| or
 | |
| .BR setstate .
 | |
| .PP
 | |
| Once a state array has been initialized, it may be restarted at a
 | |
| different point either by calling
 | |
| .B initstate
 | |
| (with the desired seed, the state array, and its size) or by calling
 | |
| both
 | |
| .B setstate
 | |
| (with the state array) and
 | |
| .B srandom
 | |
| (with the desired seed).
 | |
| The advantage of calling both
 | |
| .B setstate
 | |
| and
 | |
| .B srandom
 | |
| is that the size of the state array does not have to be remembered after
 | |
| it is initialized.
 | |
| .PP
 | |
| With 256 bytes of state information, the period of the random number
 | |
| generator is greater than
 | |
| .if t 2\u\s769\s10\d,
 | |
| .if n 2**69
 | |
| which should be sufficient for most purposes.
 | |
| .SH AUTHOR
 | |
| Earl T. Cohen
 | |
| .SH DIAGNOSTICS
 | |
| .PP
 | |
| If
 | |
| .B initstate
 | |
| is called with less than 8 bytes of state information, or if
 | |
| .B setstate
 | |
| detects that the state information has been garbled, error
 | |
| messages are printed on the standard error output.
 | |
| .SH "SEE ALSO"
 | |
| .BR rand (3).
 | |
| .SH NOTES
 | |
| .B initstate
 | |
| and
 | |
| .B setstate
 | |
| are not declared in
 | |
| .IR <stdlib.h> ,
 | |
| programmers must provide their own declarations.
 | |
| .SH BUGS
 | |
| About 2/3 the speed of
 | |
| .BR rand (3).
 | 
