1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
<?xml version="1.0" encoding="latin1" ?>
<!DOCTYPE erlref SYSTEM "erlref.dtd">
<erlref>
<header>
<copyright>
<year>1996</year><year>2011</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
The contents of this file are subject to the Erlang Public License,
Version 1.1, (the "License"); you may not use this file except in
compliance with the License. You should have received a copy of the
Erlang Public License along with this software. If not, it can be
retrieved online at http://www.erlang.org/.
Software distributed under the License is distributed on an "AS IS"
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
the License for the specific language governing rights and limitations
under the License.
</legalnotice>
<title>random</title>
<prepared>Joe Armstrong</prepared>
<responsible>Bjarne Dacker</responsible>
<docno>1</docno>
<approved>Bjarne Däcker</approved>
<checked></checked>
<date>96-09-09</date>
<rev>A</rev>
<file>random.sgml</file>
</header>
<module>random</module>
<modulesummary>Pseudo random number generation</modulesummary>
<description>
<p>Random number generator. The method is attributed to
B.A. Wichmann and I.D.Hill, in 'An efficient and portable
pseudo-random number generator', Journal of Applied
Statistics. AS183. 1982. Also Byte March 1987. </p>
<p>The current algorithm is a modification of the version attributed
to Richard A O'Keefe in the standard Prolog library.</p>
<p>Every time a random number is requested, a state is used to calculate
it, and a new state produced. The state can either be implicit (kept
in the process dictionary) or be an explicit argument and return value.
In this implementation, the state (the type <c>ran()</c>) consists of a
tuple of three integers.</p>
<p>It should be noted that this random number generator is not cryptographically
strong. If a strong cryptographic random number generator is needed for
example <c>crypto:rand_bytes/1</c> could be used instead.</p>
</description>
<datatypes>
<datatype>
<name name="ran"/>
<desc><p>The state.</p></desc>
</datatype>
</datatypes>
<funcs>
<func>
<name name="seed" arity="0"/>
<fsummary>Seeds random number generation with default values</fsummary>
<desc>
<p>Seeds random number generation with default (fixed) values
in the process dictionary, and returns the old state.</p>
</desc>
</func>
<func>
<name name="seed" arity="3"/>
<fsummary>Seeds random number generator</fsummary>
<desc>
<p>Seeds random number generation with integer values in the process
dictionary, and returns the old state.</p>
<p>One way of obtaining a seed is to use the BIF <c>now/0</c>:</p>
<code type="none">
...
{A1,A2,A3} = now(),
random:seed(A1, A2, A3),
...</code>
</desc>
</func>
<func>
<name name="seed" arity="1"/>
<fsummary>Seeds random number generator</fsummary>
<desc>
<p>
<c>seed({<anno>A1</anno>, <anno>A2</anno>, <anno>A3</anno>})</c> is equivalent to <c>seed(<anno>A1</anno>, <anno>A2</anno>, <anno>A3</anno>)</c>.
</p>
</desc>
</func>
<func>
<name name="seed0" arity="0"/>
<fsummary>Return default state for random number generation</fsummary>
<desc>
<p>Returns the default state.</p>
</desc>
</func>
<func>
<name name="uniform" arity="0"/>
<fsummary>Return a random float</fsummary>
<desc>
<p>Returns a random float uniformly distributed between <c>0.0</c>
and <c>1.0</c>, updating the state in the process dictionary.</p>
</desc>
</func>
<func>
<name name="uniform" arity="1"/>
<fsummary>Return a random integer</fsummary>
<desc>
<p>Given an integer <c><anno>N</anno> >= 1</c>, <c>uniform/1</c> returns a
random integer uniformly distributed between <c>1</c> and
<c><anno>N</anno></c>, updating the state in the process dictionary.</p>
</desc>
</func>
<func>
<name name="uniform_s" arity="1"/>
<fsummary>Return a random float</fsummary>
<desc>
<p>Given a state, <c>uniform_s/1</c>returns a random float uniformly
distributed between <c>0.0</c> and <c>1.0</c>, and a new state.</p>
</desc>
</func>
<func>
<name name="uniform_s" arity="2"/>
<fsummary>Return a random integer</fsummary>
<desc>
<p>Given an integer <c><anno>N</anno> >= 1</c> and a state, <c>uniform_s/2</c>
returns a random integer uniformly distributed between <c>1</c> and
<c><anno>N</anno></c>, and a new state.</p>
</desc>
</func>
</funcs>
<section>
<title>Note</title>
<p>Some of the functions use the process dictionary variable
<c>random_seed</c> to remember the current seed.</p>
<p>If a process calls <c>uniform/0</c> or <c>uniform/1</c> without
setting a seed first, <c>seed/0</c> is called automatically.</p>
<p>The implementation changed in R15. Upgrading to R15 will break
applications that expect a specific output for a given seed. The output
is still deterministic number series, but different compared to releases
older than R15. The seed <c>{0,0,0}</c> will for example no longer
produce a flawed series of only zeros.</p>
</section>
</erlref>
|