1RAND(3P)                   POSIX Programmer's Manual                  RAND(3P)
2
3
4

PROLOG

6       This  manual  page is part of the POSIX Programmer's Manual.  The Linux
7       implementation of this interface may differ (consult the  corresponding
8       Linux  manual page for details of Linux behavior), or the interface may
9       not be implemented on Linux.
10

NAME

12       rand, rand_r, srand - pseudo-random number generator
13

SYNOPSIS

15       #include <stdlib.h>
16
17       int rand(void);
18
19
20       int rand_r(unsigned *seed);
21       void srand(unsigned seed);
22
23

DESCRIPTION

25       The rand() function shall compute a sequence of pseudo-random  integers
26       in the range [0, {RAND_MAX}]  with a period of at least 2**32.
27
28       The  rand()  function  need  not  be  reentrant. A function that is not
29       required to be reentrant is not required to be thread-safe.
30
31       The rand_r() function shall compute a sequence of  pseudo-random  inte‐
32       gers  in  the range [0, {RAND_MAX}]. (The value of the {RAND_MAX} macro
33       shall be at least 32767.)
34
35       If rand_r() is called with  the  same  initial  value  for  the  object
36       pointed  to  by seed and that object is not modified between successive
37       returns and calls to rand_r(), the same sequence shall be generated.
38
39       The srand() function uses the argument as a seed for a new sequence  of
40       pseudo-random  numbers to be returned by subsequent calls to rand(). If
41       srand() is then called with  the  same  seed  value,  the  sequence  of
42       pseudo-random numbers shall be repeated. If rand() is called before any
43       calls to srand() are made, the same sequence shall be generated as when
44       srand() is first called with a seed value of 1.
45
46       The  implementation shall behave as if no function defined in this vol‐
47       ume of IEEE Std 1003.1-2001 calls rand() or srand().
48

RETURN VALUE

50       The rand() function shall return the next pseudo-random number  in  the
51       sequence.
52
53       The rand_r() function shall return a pseudo-random integer.
54
55       The srand() function shall not return a value.
56

ERRORS

58       No errors are defined.
59
60       The following sections are informative.
61

EXAMPLES

63   Generating a Pseudo-Random Number Sequence
64       The  following  example  demonstrates  how  to  generate  a sequence of
65       pseudo-random numbers.
66
67
68              #include <stdio.h>
69              #include <stdlib.h>
70              ...
71                  long count, i;
72                  char *keystr;
73                  int elementlen, len;
74                  char c;
75              ...
76              /* Initial random number generator. */
77                  srand(1);
78
79
80                  /* Create keys using only lowercase characters */
81                  len = 0;
82                  for (i=0; i<count; i++) {
83                      while (len < elementlen) {
84                          c = (char) (rand() % 128);
85                          if (islower(c))
86                              keystr[len++] = c;
87                      }
88
89
90                      keystr[len] = '\0';
91                      printf("%s Element%0*ld\n", keystr, elementlen, i);
92                      len = 0;
93                  }
94
95   Generating the Same Sequence on Different Machines
96       The following code defines a pair of functions that could  be  incorpo‐
97       rated  into  applications  wishing  to ensure that the same sequence of
98       numbers is generated across different machines.
99
100
101              static unsigned long next = 1;
102              int myrand(void)  /* RAND_MAX assumed to be 32767. */
103              {
104                  next = next * 1103515245 + 12345;
105                  return((unsigned)(next/65536) % 32768);
106              }
107
108
109              void mysrand(unsigned seed)
110              {
111                  next = seed;
112              }
113

APPLICATION USAGE

115       The drand48() function provides a much  more  elaborate  random  number
116       generator.
117
118       The  limitations on the amount of state that can be carried between one
119       function call and another mean  the  rand_r()  function  can  never  be
120       implemented  in  a  way  which  satisfies  all of the requirements on a
121       pseudo-random number  generator.  Therefore  this  function  should  be
122       avoided whenever non-trivial requirements (including safety) have to be
123       fulfilled.
124

RATIONALE

126       The ISO C standard  rand()  and  srand()  functions  allow  per-process
127       pseudo-random  streams  shared by all threads. Those two functions need
128       not change, but there has to be mutual-exclusion that  prevents  inter‐
129       ference  between  two  threads concurrently accessing the random number
130       generator.
131
132       With regard to rand(), there are two different behaviors  that  may  be
133       wanted in a multi-threaded program:
134
135        1. A  single  per-process  sequence  of  pseudo-rand