如何在Perl中使用可重复的随机化?

如何在Perl中使用可重复的随机化?,perl,random,Perl,Random,我有一个Perl脚本,它使用rand生成某个范围内的伪随机整数。我希望它是随机的,也就是说,不要自己将种子设置为某个常数,但如果需要,还希望能够重现特定运行的结果 你会怎么做?记录每次跑步的种子,并提供调用脚本和设置种子的方法?你的目标彼此不一致。一方面,你想要一个自我播种,完全随机的整数序列;另一方面,您需要再现性。完全随机性和再现性是相互矛盾的 你可以为你想要的东西设定种子。您可能希望有一个默认的随机确定的种子,它将在需要时为您提供完全的随机性,但可以在运行之前手动设置,以提供再现性。McW

我有一个Perl脚本,它使用rand生成某个范围内的伪随机整数。我希望它是随机的,也就是说,不要自己将种子设置为某个常数,但如果需要,还希望能够重现特定运行的结果


你会怎么做?

记录每次跑步的种子,并提供调用脚本和设置种子的方法?

你的目标彼此不一致。一方面,你想要一个自我播种,完全随机的整数序列;另一方面,您需要再现性。完全随机性和再现性是相互矛盾的

你可以为你想要的东西设定种子。您可能希望有一个默认的随机确定的种子,它将在需要时为您提供完全的随机性,但可以在运行之前手动设置,以提供再现性。

McWafflestix说:

您可能希望有一个默认的随机确定的种子,这将在需要时为您提供完全的随机性,但可以在运行之前手动设置以提供再现性

实现这一点的显而易见的方法是遵循您的常规种子设定过程,或者从强随机源手动执行,或者让perl在第一次调用rand时自动执行,然后使用第一个生成的随机值作为种子,并记录它。如果您想稍后复制,只需为种子使用记录的值

# something like this?

if ( defined $input_rand_seed ) {
    srand($input_rand_seed);
} else {
    my $seed = rand();   # or something fancier
    log_random_seed($seed);
    srand($seed);
}

你为什么不想播下种子,但同时又播下种子呢?正如我之前对你们说过的,你们需要解释为什么你们不想做某事,这样我们才知道你们实际上在问什么

您可以仅在某些条件下自行设置:

srand( $ENV{SOME_SEED} ) if defined $ENV{SOME_SEED};
如果您不调用srand,rand会自动为您调用它,但至少在Perl5.14之前,它不会报告它使用的种子


这实际上只是一个简单的编程问题。只要将您概述的内容转换为实现您所说内容的代码。

如果目的是能够再现包含随机冲击的模拟路径,例如,当您运行经济模型以生成预测时,我将放弃存储种子的想法,而是将每个序列与模型数据一起存储

请注意,内置的rand受C运行时提供的rand实现的影响。在我使用过的所有Windows机器和所有perl版本上,这通常意味着

这对于任何严肃的目的都是非常有限的。在仿真中,一个关键的标准是使用的随机序列彼此独立,因此每次运行都可以被视为独立的实现

事实上,如果您要运行1000次模拟,我将使用已知的良好生成器预先生成1000个相应的随机序列,这些生成器跨平台一致,并将它们与模型输入一起存储


如果获得新数据时参数估计值发生变化,您可以使用相同的序列或新的集合更新模拟。

我不知道获得种子的方法,除非这是您自己选择的方法-OP说他不想这样做。嘿,我从来没有真正做过,并且假设这是可能的。不过,一个快速的谷歌搜索出现了,这也是同样的讨论。建议使用$seed=intrand2**31;,然后使用srand对rand进行种子设定,在记录种子时允许随机性。perl 5.14应该增加使用空列表调用srand的功能,并且它将返回它为种子设定的值。@McWafflestix:对不起,也许我应该作为注释来做这件事?如果你觉得我在抢你的风头,欢迎你在你的答案中添加一点,我会删除我的答案;我不介意这也是一个答案。我只是指出我同意你的回答,事实上,我相信澄清是值得赞赏的。相关问题:从5.13.4开始,srand返回种子:可复制和随机不能同时进行。@brian模拟中使用的伪随机序列的可复制性对于验证结果至关重要。你在那里附加伪随机序列。我没有。我想他是在试图验证结果,但我仍然希望有一天这张海报能解决他长期存在的XY问题。@brian我现在明白你的意思了。这不是唯一的办法。您可以使用相同的预计算数字查找表。这些预先计算的数字甚至不必来自伪随机数生成器。@briandfoy:预先计算的数字的查找表,根据定义,不是随机和非种子的;这些数字可能是随机的,但它们的数量是一个种子。我不知道你认为你有什么定义,但如果我保留一个随机数字的列表,当它们出现时,那就是一个随机数字的列表。没有种子,因为没有基于以前的值创建种子的函数。你可能在谈论假随机数。我说的是实际的随机数。@Briandfoy:如果你有一份ra的列表,你是对的
当它们进入时,它们是随机数。这些数字在时间结束时仍将是随机数;然而,如果你反复使用它们,那就不太适合大多数人所认为的随机性。你真的在谈论一次性键盘的定义,它确实是随机的;不过,请注意名称中的一次性!你可以重复使用,但对于大多数随机性的需求,重复使用随机序列并不是真正需要的。这就是为什么我在其他评论中说,再现性和随机性不能结合在一起。我只是对你们发表评论,因为你们说的是唯一的方法,这几乎总是错的。我对一次性护垫很了解,你应该这样使用。在这种情况下,出于某些无法解释的原因,海报希望重用它们。你在向唱诗班布道。我终于在下面使用了[Math::Random::MT::Auto]。谢谢。Windows的兰德熵问题在更高版本的Perl中已经修复。如果你真的关心好的随机化,最好使用一个模块。