为什么在使用rand生成随机数之前需要调用srand
why is srand required to be called before generating a random number using rand
需要在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_seed
和random_number_from_seed
是纯函数,它们只使用它们的参数,不访问任何全局变量)。
这意味着,如果种子始终为0,那么rand
调用返回的一系列值将始终相同。为了允许不同的值,在每次运行中使用不同的种子。有一件事在运行之间会发生变化,并且可以很容易地使用,那就是程序的启动时间。
如果不添加srand(),每次运行程序时,rand都会生成相同的随机数。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 如何调用 ntoskrnl.exe srand 函数?
- 在具有相同种子的同一程序中对srand()的第二次调用不会为连续的rand()生成相同的值
- 在同一程序中调用srand()两次
- rand()在通过函数调用时生成相同的随机数集(即使在使用srand(time(NULL)进行种子设定之后)
- 为什么在使用rand生成随机数之前需要调用srand
- Rand() 是相同的数字生成器,即使我调用了 srand(time(NULL))
- 即使调用 srand() 也不会获得不同的随机值
- 重载函数的调用在使用 srand(time(0)) 时是不明确的
- 在c++应用程序中,我应该多久调用一次srand() ?
- Std::random_shuffle即使调用一次srand(time(0))也会产生相同的结果