1DRAND48(3P)                POSIX Programmer's Manual               DRAND48(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       drand48, erand48, jrand48, lcong48, lrand48, mrand48, nrand48,  seed48,
13       srand48 - generate uniformly distributed pseudo-random numbers
14

SYNOPSIS

16       #include <stdlib.h>
17
18       double drand48(void);
19       double erand48(unsigned short xsubi[3]);
20       long jrand48(unsigned short xsubi[3]);
21       void lcong48(unsigned short param[7]);
22       long lrand48(void);
23       long mrand48(void);
24       long nrand48(unsigned short xsubi[3]);
25       unsigned short *seed48(unsigned short seed16v[3]);
26       void srand48(long seedval);
27
28

DESCRIPTION

30       This  family  of functions shall generate pseudo-random numbers using a
31       linear congruential algorithm and 48-bit integer arithmetic.
32
33       The drand48() and erand48() functions shall return  non-negative,  dou‐
34       ble-precision,  floating-point  values,  uniformly distributed over the
35       interval [0.0,1.0).
36
37       The lrand48() and nrand48() functions shall return  non-negative,  long
38       integers, uniformly distributed over the interval [0,2**31).
39
40       The mrand48() and jrand48() functions shall return signed long integers
41       uniformly distributed over the interval [-2**31,2**31).
42
43       The srand48(), seed48(), and  lcong48()  functions  are  initialization
44       entry  points,  one of which should be invoked before either drand48(),
45       lrand48(), or mrand48() is called.  (Although  it  is  not  recommended
46       practice,  constant  default initializer values shall be supplied auto‐
47       matically if drand48(), lrand48(), or mrand48()  is  called  without  a
48       prior call to an initialization entry point.) The erand48(), nrand48(),
49       and jrand48() functions do not require an initialization entry point to
50       be called first.
51
52       All  the  routines work by generating a sequence of 48-bit integer val‐
53       ues, X_i, according to the linear congruential formula: X_n+1 = (aX_n +
54       c)_mod m   n>= 0
55
56       The  parameter m = 2**48; hence 48-bit integer arithmetic is performed.
57       Unless lcong48() is invoked, the multiplier  value  a  and  the  addend
58       value c are given by: a = 5DEECE66D_16 = 273673163155_8
59
60       c = B_16 = 13_8
61
62       The  value  returned  by  any  of  the drand48(), erand48(), jrand48(),
63       lrand48(), mrand48(), or nrand48() functions is computed by first  gen‐
64       erating  the next 48-bit X_i in the sequence. Then the appropriate num‐
65       ber of bits, according to the type of data item  to  be  returned,  are
66       copied  from the high-order (leftmost) bits of X_i and transformed into
67       the returned value.
68
69       The drand48(), lrand48(), and mrand48() functions store the last 48-bit
70       X_i  generated in an internal buffer; that is why the application shall
71       ensure  that  these  are  initialized  prior  to  being  invoked.   The
72       erand48(),  nrand48(), and jrand48() functions require the calling pro‐
73       gram to provide storage for the successive  X_i  values  in  the  array
74       specified  as  an argument when the functions are invoked.  That is why
75       these routines do not have  to  be  initialized;  the  calling  program
76       merely has to place the desired initial value of X_i into the array and
77       pass it as  an  argument.  By  using  different  arguments,  erand48(),
78       nrand48(),  and  jrand48() allow separate modules of a large program to
79       generate several independent streams of pseudo-random numbers; that is,
80       the  sequence  of numbers in each stream shall not depend upon how many
81       times the routines  are  called  to  generate  numbers  for  the  other
82       streams.
83
84       The  initializer  function srand48() sets the high-order 32 bits of X_i
85       to the low-order 32 bits contained in its argument.  The  low-order  16
86       bits of X_i are set to the arbitrary value 330E_16.
87
88       The  initializer  function seed48() sets the value of X_i to the 48-bit
89       value specified in the argument array. The low-order 16 bits of X_i are
90       set  to  the low-order 16 bits of seed16v[0].  The mid-order 16 bits of
91       X_i are set to the low-order 16 bits of seed16v[1]. The  high-order  16
92       bits  of  X_i  are set to the low-order 16 bits of seed16v[2]. In addi‐
93       tion, the previous value of X_i is copied into a 48-bit  internal  buf‐
94       fer,  used  only by seed48(), and a pointer to this buffer is the value
95       returned by seed48(). This returned pointer, which can just be  ignored
96       if  not  needed, is useful if a program is to be restarted from a given
97       point at some future time-use the pointer to get at and store the  last
98       X_i  value,  and  then use this value to reinitialize via seed48() when
99       the program is restarted.
100
101       The initializer function lcong48() allows the user to specify the  ini‐
102       tial  X_i,  the  multiplier  value a, and the addend value c.  Argument
103       array elements param[0-2] specify X_i, param[3-5]  specify  the  multi‐
104       plier a, and param[6] specifies the 16-bit addend c. After lcong48() is
105       called, a subsequent call to either srand48() or seed48() shall restore
106       the standard multiplier and addend values, a and c, specified above.
107
108       The  drand48(),  lrand48(),  and  mrand48() functions need not be reen‐
109       trant. A function that is not required to be reentrant is not  required
110       to be thread-safe.
111

RETURN VALUE

113       As described in the DESCRIPTION above.
114

ERRORS

116       No errors are defined.
117
118       The following sections are informative.
119

EXAMPLES

121       None.
122

APPLICATION USAGE

124       None.
125

RATIONALE

127       None.
128

FUTURE DIRECTIONS

130       None.
131

SEE ALSO

133       rand(), the Base Definitions volume of IEEE Std 1003.1-2001, <stdlib.h>
134
136       Portions  of  this text are reprinted and reproduced in electronic form
137       from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
138       --  Portable  Operating  System  Interface (POSIX), The Open Group Base
139       Specifications Issue 6, Copyright (C) 2001-2003  by  the  Institute  of
140       Electrical  and  Electronics  Engineers, Inc and The Open Group. In the
141       event of any discrepancy between this version and the original IEEE and
142       The  Open Group Standard, the original IEEE and The Open Group Standard
143       is the referee document. The original Standard can be  obtained  online
144       at http://www.opengroup.org/unix/online.html .
145
146
147
148IEEE/The Open Group                  2003                          DRAND48(3P)
Impressum