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

时间:2010-11-04 19:04:47

标签: perl random

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

你会做什么?

5 个答案:

答案 0 :(得分:2)

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);
}

答案 1 :(得分:1)

记录每次运行的种子并提供调用脚本并设置种子的方法吗?

答案 2 :(得分:1)

为什么不设置种子,但同时设置种子?正如我之前告诉过你的那样,你需要解释为什么你不想做某事我们知道你究竟在问什么。

您可能只在某些条件下自行设置:

srand( $ENV{SOME_SEED} ) if defined $ENV{SOME_SEED};

如果您不致电srandrand会自动为您调用,但它不会报告其使用的种子(至少在Perl 5.14之前)。

这真的只是一个简单的编程问题。只需将您概述的内容转换为执行您所说内容的代码即可。

答案 3 :(得分:1)

如果目的是为了能够重现包含随机冲击的模拟路径(例如,当您运行经济模型来产生投影时,我会放弃存储种子的想法,而是将每个序列存储在旁边模型数据。

请注意,内置的rand会受到C运行时提供的rand实现的影响。在所有Windows计算机上以及我使用的所有perl版本中,这通常意味着rand will only ever produce 32768 unique values

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

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

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

答案 4 :(得分:0)

你的目标彼此不一致。一方面,你想要一个自我种子,完全随机的整数序列;另一方面,你想要再现性。完全随机和可重复性彼此不一致。

您可以将种子设置为您想要的内容。您可能希望拥有一个默认的随机确定的种子,这将在需要时为您提供完整的随机性,但可以在手动运行之前设置,以提供可重复性。