【问题标题】:C++ srand() function in loop [duplicate]循环中的C ++ srand()函数[重复]
【发布时间】:2014-12-03 20:24:51
【问题描述】:

我知道当 srand() 函数在循环内被调用时,它会生成不同的随机数,因为srand() 在循环内并且循环可能完成不到一秒,因此我们每次都有相同的数字. 我的问题在这里:为什么当srand() 不在循环中时它可以正常工作? 如果循环完成不到一秒,那么种子再次出现,所有数字都相同......但它每次都会改变。虽然种子似乎保持不变。 试试下面的代码:

int k = 5;

while (k--)
{
    srand(time(0));
    int num1 = rand() % 6;
    cout << num1 << endl;

}

【问题讨论】:

  • 可能想展示一些示例代码。
  • 你不应该在循环中调用 srand() 。在 main 的开头调用一次,如果你有一个 c++11 编译器,最好使用 &lt;random&gt;
  • time() 的分辨率只有一秒,因此如果您快速连续多次调用它,它可以很容易地返回相同的值,这意味着您使用相同的种子调用 srand
  • srand 为随机数生成器提供种子。如果您使用与以前相同的种子调用它,则会得到相同的序列。如果您不手动执行,随机数生成器不会为每个循环迭代神奇地重置。那么,你的问题在哪里?
  • 我认为您对伪随机数生成器的工作原理缺乏基本的了解。也许这会有所帮助:stackoverflow.com/q/3539398/10077

标签: c++


【解决方案1】:

使用相同的种子,随机数生成器将产生完全相同的数字序列。

我们想要的是一个“随机”的种子,或者至少每次都不同,这样随机数的序列每次都不一样。

srand() 函数使用系统时钟作为种子。正如评论中提到的,如果您在一秒钟内多次调用srand(),然后得到一个随机数,那么您每次都会得到相同的“随机”数。

在循环外调用srand()没有什么不同,除了每次调用之间至少间隔一秒钟的事实。这意味着种子不同,产生的数字也不同。

另外,正如另一条评论中提到的,通常只需要在程序开始时为随机数生成器播种一次。如果出于某种原因您想要多次生成相同的数字序列,您可能想要这样做。

【讨论】:

  • 好吧,我不认为“在每次通话之间至少有一秒钟的时间会调用它”。因为我运行一个包含 36000 次调用循环的代码,所以它必须至少需要 36000 秒,但不会超过一秒......
  • 好吧,我不是说在你的程序中,我只是说“偶尔调用srand()”。另请注意,我说的是“可能会被调用”而不是“将被调用”,两次调用之间至少有一次。就像我说的那样,实际上没有任何理由多次调用它。
  • 那么,你不知道另一个可能的原因吗?!
  • 首先,冷静下来。其次,如果您正在寻找调用 srand() 的理由,@FredLarson 上面链接的帖子至少有一个:在调试时,拥有相同的数字序列可能很有用,因此结果是可预测的。另一个可能是用于单元测试,同样是为了可预测性。当然,如果底层生成器发生变化,那么可预测性可能会发生变化。然而,一般来说,随机数应该是随机的——不可预测的。因此,在大多数“正常”情况下,您只想调用 srand 一次。
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多