C++ C++;循环中的srand()函数

C++ C++;循环中的srand()函数,c++,C++,我知道,当在循环内调用srand()函数时,它将生成不同的随机数,因为srand()在循环内,并且循环可能在不到一秒钟的时间内完成,因此我们每次都有相同的数。 我的问题是:为什么当srand()退出循环时它能正常工作? 如果循环在不到一秒的时间内完成,那么种子会再次出现,所有数字都是一样的……但每次都会发生变化。虽然种子看起来是一样的。 请尝试以下代码: int k = 5; while (k--) { srand(time(0)); int num1 = rand() % 6

我知道,当在循环内调用srand()函数时,它将生成不同的随机数,因为
srand()
在循环内,并且循环可能在不到一秒钟的时间内完成,因此我们每次都有相同的数。 我的问题是:为什么当
srand()
退出循环时它能正常工作? 如果循环在不到一秒的时间内完成,那么种子会再次出现,所有数字都是一样的……但每次都会发生变化。虽然种子看起来是一样的。 请尝试以下代码:

int k = 5;

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

}
intk=5;
而(k--)
{
srand(时间(0));
int num1=rand()%6;

cout对于相同的种子,随机数生成器将产生完全相同的数字序列

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

srand()
函数使用系统时钟作为种子。如注释中所述,如果您在这一秒期间多次调用
srand()
,然后得到一个随机数,则每次都会得到相同的“随机”数

在循环外部调用
srand()
没有什么不同,只是每次调用之间可能至少间隔一秒钟。这意味着种子不同,生成的数字也不同


另外,如另一条评论所述,通常只需要在程序开始时为随机数生成器种子设定一次。如果出于某种原因,您希望多次生成相同的数字序列,则可能不希望这样做。

可能希望显示一些示例代码。您不应该调用srand()在一个循环中。在main的开头调用它一次,如果您有一个c++11编译器,最好使用
time()
只有1秒的分辨率,因此如果您快速连续多次调用它,它可以很容易地返回相同的值,这意味着您使用相同的种子调用
srand
srand
为随机数生成器种子。如果您使用相同的种子调用它,则会得到相同的序列。以及随机数-如果您不手动执行,生成器不会在每次循环迭代中神奇地重置。那么,您的问题在哪里?我认为您对伪随机数生成器的工作原理缺乏基本的了解。也许这会有所帮助:我不认为“每次调用之间可能至少有一秒钟的时间调用它”.因为我运行的代码循环有36000个调用,所以至少需要36000秒,但不会超过一秒…我不是说在你的程序中,我只是说“偶尔调用srand()”。还要注意,我说的是“可能被调用”不会被调用通话间隔至少有一秒。就像我说的,其实没有理由再打一次。那么,你不知道另一个可能的原因吗?!首先,冷静。其次,如果你想找理由打srand(),上面由@Fredrarson链接的帖子至少有一个:在调试时,拥有相同的数字序列可能会很有用,这样结果是可预测的。另一个可能是用于单元测试,同样是用于可预测性。当然,如果基础生成器发生更改,则可预测性可能会发生更改。不过,一般来说,支持随机数sed是随机的-不可预测的。因此,在大多数“正常”情况下,您只需要调用srand一次。