在同一程序中调用srand()两次
Calling srand() twice in the same program
为什么当我在两个非常不同的点调用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));
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 对结构向量进行两次排序
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 在同一程序中调用srand()两次