我在for循环中迭代perl脚本,并在我的脚本中使用srand(time¦$$)
来播种随机数。
在我的输出中,当我得到单独的结果时,我得到了重复的结果,如果我一次只做一个而不是使用for循环。这是因为srand
系列?有什么建议么?
谢谢!
我在for循环中迭代perl脚本,并在我的脚本中使用srand(time¦$$)
来播种随机数。
在我的输出中,当我得到单独的结果时,我得到了重复的结果,如果我一次只做一个而不是使用for循环。这是因为srand
系列?有什么建议么?
谢谢!
调用srand
具有相同的编号会导致由以下rand
调用返回的相同数字序列。因此,如果您连续快速地(例如在同一秒内)执行srand(time() | $$)
,那么您就是这样做的:调用srand
具有相同的值,从而生成由rand
生成的相同序列。
查看perldoc页面到srand
。
文档还提到的一件事是,如果您先拨打rand
而不先拨srand
,那么Perl实际上会为您拨打srand
。因此,您首先不需要在脚本中调用srand
。
该文档还强烈建议不要每个进程调用srand
多次,因为这会导致熵的丢失。
谢谢!它现在工作! – user1637359
不是Perl的专家,但这肯定是由于循环的一次迭代快于1ms,所以srand函数被多次调用相同的种子值。您应该在for循环之外初始化随机数生成器(或者完全忽略它);在循环内部,只需使用rand。
'时间'的分辨率为1秒,而不是1毫秒,因此实际上更糟糕:在同一秒内多次调用'srand'就足够了。 –
除非你自愿想多次获得相同的随机数运行,否则'srand'应该被称为每个程序_once_。 – Mat
我不想得到相同的随机数运行。我把我所有的代码都放在了for循环中,这可以工作,但是我在输出中得到了连续的重复。 – user1637359
然后确保你只调用'srand' _once_(或者根本就没有)。将该呼叫移出循环。 – Mat