2012-09-01 49 views
1

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

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

谢谢!

+4

除非你自愿想多次获得相同的随机数运行,否则'srand'应该被称为每个程序_once_。 – Mat

+0

我不想得到相同的随机数运行。我把我所有的代码都放在了for循环中,这可以工作,但是我在输出中得到了连续的重复。 – user1637359

+4

然后确保你只调用'srand' _once_(或者根本就没有)。将该呼叫移出循环。 – Mat

回答

14

调用srand具有相同的编号会导致由以下rand调用返回的相同数字序列。因此,如果您连续快速地(例如在同一秒内)执行srand(time() | $$),那么您就是这样做的:调用srand具有相同的值,从而生成由rand生成的相同序列。

查看perldoc页面到srand

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

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

+0

谢谢!它现在工作! – user1637359

3

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

+7

'时间'的分辨率为1秒,而不是1毫秒,因此实际上更糟糕:在同一秒内多次调用'srand'就足够了。 –