如何在Perl中存储伪随机生成器的状态?

时间:2010-03-02 00:18:26

标签: perl srand random-seed

有没有办法在Perl中存储内置的伪随机数生成器的当前状态,这样当我的程序再次运行时,它可以从它停止的位置获取序列,而不是从新的序列开始?

现在,我正在存储我和初始种子的位置,然后使用类似的东西丢弃我已经看到的初始段:

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

例如:

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

随后:

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

然后,$z[0] == $v[2]$z[1] == $v[3]等。

2 个答案:

答案 0 :(得分:6)

我认为内置的rand不允许你这样做。但您可以使用替代rand。例如,Math::Random::MT::Auto允许您serialize its objects(可能包括$MRMA::PRNG,这是替换rand使用的对象。

但是,我不太清楚重点是什么。如果它是一个相当随机的序列,你怎么知道你是继续这个序列还是开始一个新序列?

答案 1 :(得分:1)

截至perl 5.13.4srand returns the seed

  

srand()现在返回种子

     

这允许需要具有可重复结果的程序不必提供它们自己的种子生成机制。相反,他们可以使用srand()并以某种方式存储返回以供将来使用。典型的测试程序有太多的组合,无法在每次运行的可用时间内进行全面测试。它可以每次测试一个随机子集,如果出现故障,请记录用于该运行的种子,以便以后可以用它来重现精确的结果。