[erlang-questions] random:seed in R14, R15, ...

Richard O'Keefe ok@REDACTED
Fri Jul 20 00:12:20 CEST 2012


On 19/07/2012, at 6:23 PM, Uwe Dauernheim wrote:

> When writing test cases that exercise e.g. random:uniform/0 one wants to use random:seed/1 with a fixed seed for deterministic test results, but providing the seed function with a fixed value seems to result in a different sequence for R14 and R15 (maybe for older or upcoming release as well). This is a problem when distributing your code and you are not sure which release will be used.
> 
> What is the common solution for this?

The solution that is common across programming languages is to
use your own random number generator.

For example, here's Marsaglia's KISS in Erlang:

initial_state() ->
    { 123456789, 362436000, 521288629, 7654321 }.

kiss({X0,Y0,Z0,C0}) ->
    X  = 69069 * X0 + 12345,
    Y1 = ((Y0 band 524287) bsl 13) bxor Y0,
    Y2 = (Y1 bsr 17) band Y1,
    Y  = ((Y2 band 134217727) bsl 5) bxor Y2,
    T  = Z0 * 698769069 + C0,
    Z  = T band 4294967295,
    C  = T bsr 32,
    {(X + Y + Z) band 4294967295, {X,Y,Z,C}}.

This generates a stream of 32-bit integers
"with period > 2^125" according to Marsaglia.
(I hope I've transcribed it correctly.)  The
initial state is any four 32-bit integers.

kissf(State0) ->
    {I, State} = kiss(State),
    {(I+1)/4294967297.0, State}.

This gives you 32 bits worth of random floats
in the open interval (0.0,1.0).  With trickier
code one could do better.






More information about the erlang-questions mailing list