Originální popis anglicky:
rand, rand_r, srand - pseudo-random number generator
Návod, kniha: Linux Programmer's Manual
#include <stdlib.h>
int rand(void);
int rand_r(unsigned int *seedp);
void srand(unsigned int seed);
The
rand() function returns a pseudo-random integer between 0 and
RAND_MAX.
The
srand() function sets its argument as the seed for a new sequence of
pseudo-random integers to be returned by
rand(). These sequences are
repeatable by calling
srand() with the same seed value.
If no seed value is provided, the
rand() function is automatically seeded
with a value of 1.
The function
rand() is not reentrant or thread-safe, since it uses hidden
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 elaborate. In order to
get reproducible behaviour in a threaded application, this state must be made
explicit. The function
rand_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. Try
drand48_r(3)
instead.
The
rand() and
rand_r() functions return a value between 0 and
RAND_MAX. The
srand() function returns no value.
POSIX 1003.1-2003 gives the following example of an implementation of
rand() and
srand(), 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;
}
The versions of
rand() and
srand() in the Linux C Library use the
same random number generator as
random() and
srandom(), so the
lower-order bits should be as random as the higher-order bits. However, on
older
rand() implementations, and on current implementations on
different systems, the lower-order bits are much less random than the
higher-order bits. Do not use this function in applications intended to be
portable when good randomness is needed.
FreeBSD adds a function
void sranddev(void);
that initializes the seed for their bad random generator
rand() with a
value obtained from their good random generator
random(). Strange.
In
Numerical Recipes in 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 following comments
are made:
"If you want to generate a random integer
between 1 and 10, you should always do it by using high-order bits, as in
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
and never by anything resembling
(which uses lower-order bits)."
Random-number generation is a complex topic. The
Numerical Recipes in C
book (see reference above) provides an excellent discussion of practical
random-number generation issues in Chapter 7 (Random Numbers).
For a more theoretical discussion which also covers many practical issues in
depth, please see Chapter 3 (Random Numbers) in Donald E. Knuth's
The Art
of Computer Programming, volume 2 (Seminumerical Algorithms), 2nd ed.;
Reading, Massachusetts: Addison-Wesley Publishing Company, 1981.
The functions
rand() and
srand() conform to SVID 3, BSD 4.3, ISO
9899, POSIX 1003.1-2003. The function
rand_r() is from POSIX
1003.1-2003.
drand48(3),
random(3)