【问题标题】:how to avoid repeats while using srand(time¦$$) in an iterated for loop?在迭代的 for 循环中使用 srand(time¦$$) 时如何避免重复?
【发布时间】:2012-09-01 10:45:20
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • srand 应该在每个程序中调用 一次,除非您自愿想要多次获得相同的随机数。
  • 我不想得到同样的随机数。我将所有代码都卡在一个 for 循环中,它可以工作,但我在输出中得到连续重复
  • 然后确保你只调用srand一次(或者实际上根本不调用)。将该调用移出循环。
  • 如果您每次都想要不同的序列,则根本不应该使用srand。它旨在提供随机但可重现的数据,以便可以重复运行。 Perl 内部提供了一个非常有效的随机种子,只要你不自己调用srand
  • @Mat,我敢说,你永远不应该调用srand,但如果你这样做,每个进程不应超过一个。跨度>

标签: perl for-loop srand


【解决方案1】:

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

请参阅srand 的 perldoc 页面。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • time 的分辨率为 1 秒,而不是 1 毫秒,因此实际上更糟糕:在同一秒内多次调用 srand 就足够了。
    猜你喜欢
    • 2023-02-06
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多