# Seth Woolley's Man Viewer

## Manual for rand - man 3 rand

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

```RAND(3)                    Linux Programmer's Manual                   RAND(3)

NAME
rand(1,3), rand_r, srand - pseudo-random number generator

SYNOPSIS
#include <stdlib.h>

int rand(1,3)(void);

int rand_r(unsigned int *seedp);

void srand(unsigned int seed);

DESCRIPTION
The  rand(1,3)()  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(1,3)().  These sequences
are repeatable by calling srand() with the same seed value.

If no seed value is provided,  the  rand(1,3)()  function  is  automatically
seeded with a value of 1.

The function rand(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 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

RETURN VALUE
The rand(1,3)()  and  rand_r()  functions  return  a  value  between  0  and
RAND_MAX.  The srand() function returns no value.

EXAMPLE
POSIX  1003.1-2003  gives the following example of an implementation of
rand(1,3)() 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;
}

NOTES
The  versions of rand(1,3)() and srand() in(1,8) the Linux C Library use the same
random(3,4,6) number generator as random(3,4,6)() and srandom(), so  the  lower-order
bits  should  be as random(3,4,6) as the higher-order bits.  However, on older
rand(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.

void sranddev(void);

that  initializes the seed for their bad random(3,4,6) generator rand(1,3)() with a
value obtained from their good random(3,4,6) generator random(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-
"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-
Company, 1981.

CONFORMING TO
The functions rand(1,3)() 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.