如何在迭代for循环中使用srand(time | $$)时避免重复?

时间:2012-09-01 10:45:20

标签: perl for-loop srand

我在for循环中迭代perl脚本,并在我的脚本中使用srand(time¦$$)来播种随机数。

在我的输出中,当我得到单独的结果时,如果我一次只执行一次而不是使用for循环,我会得到重复的结果。这是因为srand行吗?有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:14)

使用相同号码呼叫srand会导致以下rand个呼叫返回相同的号码序列。因此,如果您快速连续srand(time() | $$)(例如在同一秒内),那么您就是这么做的:使用相同的值调用srand,从而生成由rand生成的相同序列

请参阅srand的perldoc页面。

文档还提到的一件事是,如果您先调用rand而不先调用srand,那么Perl实际上会为您调用srand。因此,您首先不需要在脚本中调用srand

文档还强烈建议不要每个进程多次调用srand,因为这会导致熵丢失。

答案 1 :(得分:3)

不是Perl的专家,但这肯定是由于循环的一次迭代比1 ms快,所以srand函数被调用多次,具有相同的种子值。你应该在for循环之外初始化随机数生成器(或者完全省略它);在循环内部,只需使用rand。