Search code examples
perlsrandrandom-seed

How can I store the state of the pseudo-random generator in Perl?


Is there a way to store the current state of the built in pseudo-random number generator in Perl so that when my program is run again, it can pick up the sequence from where it left off rather than starting with a new sequence?

Right now, I am storing where I am as well as the initial seed and then throwing away the initial segment which I have already seen using something similar to:

sub consume_upto_n {
    my ($seed, $n) = @_;
    $n = 1 unless defined $n and $n >= 1;
    srand $seed;
    rand for 1 .. $n - 1;
    return;
}

For example:

srand 0x18;
my @v = map { rand } 1 .. 5;

Later:

consume_upto_n(0x18, 3);
my @z = map { rand } 3 .. 5;

Then, $z[0] == $v[2], $z[1] == $v[3] etc.


Solution

  • As of perl 5.13.4, srand returns the seed:

    srand() now returns the seed

    This allows programs that need to have repeatable results to not have to come up with their own seed generating mechanism. Instead, they can use srand() and somehow stash the return for future use. Typical is a test program which has too many combinations to test comprehensively in the time available to it each run. It can test a random subset each time, and should there be a failure, log the seed used for that run so that it can later be used to reproduce the exact results.