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
       generator. Try drand48_r(3) instead.

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.

       FreeBSD adds a function

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

SEE ALSO
       drand48(3), random(3,4,6)(3)



                                  2003-11-15                           RAND(3)

References for this manual (incoming links)