Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中存储伪随机生成器的状态?_Perl_Srand_Random Seed - Fatal编程技术网

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

如何在Perl中存储伪随机生成器的状态?,perl,srand,random-seed,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;

有没有一种方法可以将内置伪随机数生成器的当前状态存储在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]
等等。

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

不过,我不太清楚重点是什么。如果这是一个合理的随机序列,你如何判断你是继续这个序列还是开始一个新的序列

srand()
现在返回种子

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


@cjm这是为了模拟目的。假设我有一个需要10000次绘制的模拟。随机数生成器的质量并不重要,但复制(对于任何给定的
perl
+OS+app版本组合)给定序列的能力很重要。我想能够在中间中断它,从我们离开的地方拾起。这样,我就可以通过存储初始种子来复制事件的精确序列。西南:你需要做的事情有很多:能够在任意点继续序列,并且能够重新启动完全相同的点。这两个都可以使用Math::Random::*模块中的一个来完成,但是从perl源代码的粗略检查来看,即使使用XS,也无法(轻松地)使用内置的rand()来完成!(Perl可以将c库的rand()称为其rand()的一部分,并且实现似乎依赖于平台。)@cjm和@tsee无论如何都不必依赖内置的
rand