aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Greco <[email protected]>2010-10-06 03:22:41 +0200
committerSverker Eriksson <[email protected]>2011-03-28 16:56:46 +0200
commitc50f179a15ad8c8bcbc7a71101a9ca23f19f6e8f (patch)
tree36b49dbd477732cbf8051ee645d759d291c7619c
parent9f78db422a8facfaad909a656ffabeb27f8fe2fd (diff)
downloadotp-c50f179a15ad8c8bcbc7a71101a9ca23f19f6e8f.tar.gz
otp-c50f179a15ad8c8bcbc7a71101a9ca23f19f6e8f.tar.bz2
otp-c50f179a15ad8c8bcbc7a71101a9ca23f19f6e8f.zip
Fix a bug in the implementation of the pseudo-random number generator
This commit fixes an error in the mathematical formula of the Wichmann-Hill pseudo-random number generator. In particular, the implementation used until now produces sequences which differ from the expected ones by an extra starting number, which is instead the very last value of the sequence. This bug amplified the effect of extremely correlated initial numbers when seeding different generators with very similar seed values.
-rw-r--r--lib/stdlib/src/random.erl4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/stdlib/src/random.erl b/lib/stdlib/src/random.erl
index 01227c29b4..d94722cb33 100644
--- a/lib/stdlib/src/random.erl
+++ b/lib/stdlib/src/random.erl
@@ -86,7 +86,7 @@ uniform() ->
B2 = (A2*172) rem 30307,
B3 = (A3*170) rem 30323,
put(random_seed, {B1,B2,B3}),
- R = A1/30269 + A2/30307 + A3/30323,
+ R = B1/30269 + B2/30307 + B3/30323,
R - trunc(R).
%% uniform(N) -> I
@@ -110,7 +110,7 @@ uniform_s({A1, A2, A3}) ->
B1 = (A1*171) rem 30269,
B2 = (A2*172) rem 30307,
B3 = (A3*170) rem 30323,
- R = A1/30269 + A2/30307 + A3/30323,
+ R = B1/30269 + B2/30307 + B3/30323,
{R - trunc(R), {B1,B2,B3}}.
%% uniform_s(N, State) -> {I, NewState}