在同一程序中调用srand()两次

Calling srand() twice in the same program

本文关键字:srand 两次 调用 程序      更新时间:2023-10-16

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

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

最常见的用例是只为生成器设置一次种子,并使用合适的"随机"值(例如惯用的time(NULL))。这保证了使您可能在不同的程序执行中获得不同的伪随机数序列。

然而,偶尔您可能希望使伪随机序列"可重放"。想象一下,您正在对随机数据测试几种排序算法。为了获得公平的比较,您应该在完全相同的数据上测试每种算法,这样您就可以在每次运行之前用相同的种子重新为生成器播种。

换言之:如果你想让这些数字只是伪随机的,那么种子一次,并使用尽可能随机的值。如果你想要一些控制&可重放性,必要时播种。

srand (seed);

具有相同种子的两个不同初始化将生成在随后对rand的调用中也会出现同样的连续结果。

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

每次rand()与srand()一起播种时,都必须产生相同的结果值的序列。

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

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

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

srand(time(NULL));

它应该工作:)

您可能了解到伪随机数生成器、标准库srand rand函数就是其中之一的实现。其核心思想是用特殊的数字种子初始化伪随机生成器。srand()用于设置种子。对于每个种子,伪随机生成器生成完全相同的数字序列。通过使用不同的种子,你会得到不同的数字序列。所以,如果你想在每次启动程序时获得不同的随机数,你需要每次都设置新的种子。做到这一点最简单的方法之一就是利用时间播种。

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