代码之家  ›  专栏  ›  技术社区  ›  Sinan Ünür

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

  •  10
  • Sinan Ünür  · 技术社区  · 14 年前

    有没有一种方法可以将内置的伪随机数生成器的当前状态存储在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 回复  |  直到 11 年前
        1
  •  6
  •   cjm    14 年前

    我不认为内置的 rand 允许你这么做。但是你可以用替代品 兰德 . 例如, Math::Random::MT::Auto 允许您 serialize its objects (大概包括 $MRMA::PRNG ,它是由其替换使用的对象 兰德 )

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

        2
  •  1
  •   Sinan Ünür    14 年前

    至于 perl 5.13.4 , srand returns the seed :

    srand() 现在返回种子

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