【问题标题】:Calling srand() twice in the same program [closed]在同一个程序中调用 srand() 两次 [关闭]
【发布时间】:2014-02-12 11:16:41
【问题描述】:

为什么当我在 2 个非常不同的点调用 srand() 时会导致数字不是随机的?一旦我删除其中一个,它就会恢复正常。

【问题讨论】:

  • 你必须展示一些代码来说明你的意思,并用“非随机”来描述你的意思。 rand() 是一个-随机数生成器;它生成的数字序列完全取决于最近对srand() 的调用。

标签: c++ visual-c++ random srand


【解决方案1】:

这取决于您如何称呼它。 srand() 的目的是播种rand() 使用的伪随机数生成器。所以当你调用srand(i) 时,它会将rand() 初始化为一个依赖于i 的固定序列。因此,当您使用相同的种子重新播种时,您会开始获得相同的序列。

最常见的用例是只为生成器播种一次,并使用合适的“随机”值(例如惯用的time(NULL))。这个保证让你很可能在不同的程序执行中得到不同的伪随机数序列。

但是,有时您可能想要使伪随机序列“可重放”。想象一下,您正在对随机数据测试几种排序算法。为了获得公平的比较,您应该在完全相同的数据上测试每个算法 - 这样您就可以在每次运行之前使用相同的种子重新播种生成器。

换句话说:如果您希望数字只是伪随机的,请播种一次,并使用尽可能随机的值。如果您想要一些控制和可重玩性,请根据需要播种。

【讨论】:

    【解决方案2】:
    srand (seed);
    

    使用相同种子的两个不同初始化将生成 在后续调用 rand 时会产生相同的连续结果。

    如果种子设置为 1,则生成器将重新初始化为其初始值 值并产生与调用 rand 或之前相同的值 srand。

    每次 rand() 使用 srand() 播种时,它必须产生相同的结果 值序列。

    http://www.cplusplus.com/reference/cstdlib/srand/

    http://en.cppreference.com/w/cpp/numeric/random/srand

    【讨论】:

      【解决方案3】:

      你在初始化 srand 吗?您必须在函数/代码的开头初始化它,如下所示:

      srand(time(NULL));
      

      它应该工作:)

      【讨论】:

      • 当您稍后在同一个程序中调用srand(time(NULL));,很快time(NULL) 返回与第一次完全相同的值时,您认为会发生什么?
      • 嗯,最终会的,但我假设他的程序不是很复杂。
      • “最终”?我不是指几天后计数器溢出,我指的是在同一秒内调用time(NULL) 两次(或任何其他单位time_t 用于特定系统)。特别是如果程序不是一个复杂的程序,程序的完整运行甚至不需要花费一秒钟。
      • 你能解释一下你想说什么吗?我的 awnser 是我们可以看到他想要什么。这只是 rand() 的初始化。
      • 我想说的是:问题已经说明srand 调用了。它被调用了两次。现在,假设您再次调用srand(time(NULL)),然后是rand(),然后是srand(time(NULL)),然后是rand()。这可能会给出两次相同的“随机”数字,因为time(NULL) 可能会给出两次相同的值。因此,再添加一个 srand(time(NULL)) 不会使 OP 受益。
      【解决方案4】:

      您可以阅读有关伪随机数生成器的信息,标准库 srand-rand 函数是其中之一的实现。 核心思想是伪随机生成器用特殊的数字--seed初始化。 srand() 用于设置种子。对于每个种子伪随机生成器,都会生成完全相同的数字序列。通过使用不同的种子,您将获得不同的数字序列。 因此,如果您想在每次启动程序时获得不同的随机数,则每次都需要设置新的种子。 最简单的方法之一是将时间用于种子。

      #include <time.h>
      
      srand((unsigned int)time(0));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多