我在for循环中迭代perl脚本,并在我的脚本中使用srand(time¦$$)
来播种随机数。
在我的输出中,当我得到单独的结果时,如果我一次只执行一次而不是使用for循环,我会得到重复的结果。这是因为srand
行吗?有什么建议吗?
谢谢!
答案 0 :(得分:14)
使用相同号码呼叫srand
会导致以下rand
个呼叫返回相同的号码序列。因此,如果您快速连续srand(time() | $$)
(例如在同一秒内),那么您就是这么做的:使用相同的值调用srand
,从而生成由rand
生成的相同序列
请参阅srand
的perldoc页面。
文档还提到的一件事是,如果您先调用rand
而不先调用srand
,那么Perl实际上会为您调用srand
。因此,您首先不需要在脚本中调用srand
。
文档还强烈建议不要每个进程多次调用srand
,因为这会导致熵丢失。
答案 1 :(得分:3)
不是Perl的专家,但这肯定是由于循环的一次迭代比1 ms快,所以srand函数被调用多次,具有相同的种子值。你应该在for循环之外初始化随机数生成器(或者完全省略它);在循环内部,只需使用rand。