为什么在使用rand生成随机数之前需要调用srand

why is srand required to be called before generating a random number using rand

本文关键字:srand 调用 随机数 rand 为什么      更新时间:2023-10-16

需要在srand(time(NULL));的行上调用srand来设置rand()的种子以生成随机数。我的问题是对种子的需求是什么?

rand()函数是伪随机数生成器,即

rand()函数返回一个范围从0到rand_MAX(包括)的伪随机整数

伪随机数的生成取决于种子。如果不提供不同的值作为种子,则在应用程序的每次调用中都会得到相同的随机数。这就是为什么srand()用于随机化种子本身。

最常见的做法:srand(time(NULL))[适用于单次运行评估]。

[explicit]种子需要什么?

值得一提的是,来自手册页

如果没有提供种子值,rand()函数将自动使用值1进行种子设定。

我想你的问题是,为什么它没有自动播种一个不可预测的值(比如当前时间)。

让随机数生成器在每次程序启动时生成相同的序列可以方便地进行调试。

随机数的生成是迭代过程的结果。每次调用rand都会发生以下情况:

seed := create_new_seed(seed);
return random_number_from_seed(seed);

(注意,create_new_seedrandom_number_from_seed是纯函数,它们只使用它们的参数,不访问任何全局变量)。

这意味着,如果种子始终为0,那么rand调用返回的一系列值将始终相同。为了允许不同的值,在每次运行中使用不同的种子。有一件事在运行之间会发生变化,并且可以很容易地使用,那就是程序的启动时间。

如果不添加srand(),每次运行程序时,rand都会生成相同的随机数。