10

有没有办法在 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]等等。

4

2 回答 2

6

我不认为内置rand允许你这样做。但你可以使用替代品rand。例如,Math::Random::MT::Auto允许您序列化它的对象(大概包括$MRMA::PRNG,这是被替换使用的对象rand)。

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

于 2010-03-02T00:40:14.903 回答
1

perl 5.13.4开始,srand返回种子

srand()现在返回种子

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

于 2010-10-04T14:20:08.223 回答