rand

TriggerTek Logo
abcdefghijklmnopqrstuvwxyz_
RAND(3)			  Linux Programmer’s Manual		      RAND(3)



NAME
       rand, rand_r, srand - pseudo-random number generator

SYNOPSIS
       #include <stdlib.h>

       int rand(void);

       int rand_r(unsigned int *seedp);

       void srand(unsigned int seed);

DESCRIPTION
       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 appli-
       cation,	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.

RETURN VALUE
       The rand() 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() 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() 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

		     j=1+(rand() % 10);

	      (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 prac-
       tical 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 Algo-
       rithms),	 2nd  ed.;  Reading, Massachusetts: Addison-Wesley Publishing
       Company, 1981.

CONFORMING TO
       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.

SEE ALSO
       drand48(3), random(3)



				  2003-11-15			      RAND(3)