`
([section] manual, -k keyword, -K [section] search, -f whatis)
man
plain
no title
`

RAND(3) Linux Programmer's Manual RAND(3)NAMErand(1,3), rand_r, srand - pseudo-random number generatorSYNOPSIS#include <stdlib.h>int rand(1,3)(void);int rand_r(unsigned int *seedp);void srand(unsigned intseed);DESCRIPTIONTherand(1,3)()function returns a pseudo-random integer between 0 andRAND_MAX. Thesrand()function sets its argument as the seed for a new sequence of pseudo-random integers to be returned byrand(1,3)(). These sequences are repeatable by callingsrand()with the same seed value. If no seed value is provided, therand(1,3)()function is automatically seeded with a value of 1. The functionrand(1,3)()is not reentrant or thread-safe, since it uses hid- den state that is modified on each call. This might just be the seed value to be used by the next call, or it might be something more elabo- rate. In order to get reproducible behaviour in(1,8) a threaded application, this state must be made explicit. The functionrand_r()is supplied with a pointer to an unsigned int, to be used as state. This is a very small amount of state, so this function will be a weak pseudo-random generator. Trydrand48_r(3) instead.RETURN VALUETherand(1,3)()andrand_r()functions return a value between 0 and RAND_MAX. Thesrand()function returns no value.EXAMPLEPOSIX 1003.1-2003 gives the following example of an implementation ofrand(1,3)()andsrand(), possibly useful when one needs the same sequence on two different machines. static unsigned long next = 1; /* RAND_MAX assumed to be 32767 */ int myrand(void) { next = next * 1103515245 + 12345; return((unsigned)(next/65536) % 32768); } void mysrand(unsigned seed) { next = seed; }NOTESThe versions ofrand(1,3)()andsrand()in(1,8) the Linux C Library use the same random(3,4,6) number generator asrandom(3,4,6)()andsrandom(), so the lower-order bits should be as random(3,4,6) as the higher-order bits. However, on olderrand(1,3)()implementations, and on current implementations on different systems, the lower-order bits are much less(1,3) random(3,4,6) than the higher- order bits. Do not use this function in(1,8) applications intended to be portable when good randomness is needed. FreeBSD adds a functionvoid sranddev(void);that initializes the seed for their bad random(3,4,6) generatorrand(1,3)()with a value obtained from their good random(3,4,6) generatorrandom(3,4,6)(). Strange. In Numerical Recipes in(1,8) C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 1992 (2nd ed., p. 277)), the follow- ing comments are made: "If you want to generate a random(3,4,6) integer between 1 and 10, you should always do it by using high-order bits, as in(1,8) j=1+(int) (10.0*rand(1,3)()/(RAND_MAX+1.0)); and never by anything resembling j=1+(rand(1,3)() % 10); (which uses lower-order bits)." Random-number generation is a complex topic. The Numerical Recipes in(1,8) C book (see reference above) provides an excellent discussion of prac- tical random-number generation issues in(1,8) Chapter 7 (Random Numbers). For a more theoretical discussion which also covers many practical issues in(1,8) depth, please see Chapter 3 (Random Numbers) in(1,8) Donald E. Knuth's The Art of Computer Programming, volume 2 (Seminumerical Algo- rithms), 2nd ed.; Reading, Massachusetts: Addison-Wesley Publishing Company, 1981.CONFORMING TOThe functionsrand(1,3)()andsrand()conform to SVID 3, BSD 4.3, ISO 9899, POSIX 1003.1-2003. The functionrand_r()is from POSIX 1003.1-2003.SEE ALSOdrand48(3),random(3,4,6)(3) 2003-11-15 RAND(3)