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.
As of perl 5.13.4,
srand
returns the seed:I don't think the built-in
rand
allows you to do that. But you can use a substituterand
. For example, Math::Random::MT::Auto allows you to serialize its objects (presumably including$MRMA::PRNG
, which is the object that gets used by its replacementrand
).I'm not quite sure what the point is, though. If it's a reasonably random sequence, how can you tell whether you're continuing that sequence or starting a new one?