diff options
author | Cristian Greco <[email protected]> | 2010-10-06 03:22:41 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2011-03-28 16:56:46 +0200 |
commit | c50f179a15ad8c8bcbc7a71101a9ca23f19f6e8f (patch) | |
tree | 36b49dbd477732cbf8051ee645d759d291c7619c /lib/stdlib/src/random.erl | |
parent | 9f78db422a8facfaad909a656ffabeb27f8fe2fd (diff) | |
download | otp-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.
Diffstat (limited to 'lib/stdlib/src/random.erl')
-rw-r--r-- | lib/stdlib/src/random.erl | 4 |
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} |