gcc环境下使用srand后rand()仍每次返回相同结果的问题
问题原因分析
- 你调用
srand(5)时给随机数生成器传入了固定的种子值5,伪随机数生成器的特性就是:相同的种子一定会生成完全相同的随机数序列,所以你每次运行程序输出的结果自然完全一致,这不是代码错误,是srand的正常工作逻辑。 - 固定种子的写法一般用于可复现的测试场景,如果需要每次运行生成不同的随机序列,需要传入每次运行都会变化的种子值。
修复方案
最常用的可变种子是系统当前的时间戳,修改步骤如下:
- 新增引入
<ctime>头文件 - 把
srand(5)替换为srand((unsigned int)time(NULL))
修改后的完整代码如下:
#include <iostream> #include <cstdlib> // 新增时间相关头文件 #include <ctime> using namespace std; int main(void) { int i, x; // 用系统当前时间作为随机种子 srand((unsigned int)time(NULL)); for(i=1;i<=10;++i) { x=rand()%5; cout << x << endl; } return 0; }
注意:
time(NULL)的精度是秒级,如果你的程序在1秒内多次启动,还是可能出现相同的输出。需要更高精度的种子可以使用操作系统提供的真随机源,或是C++11之后<random>库提供的std::random_device真随机设备。
内容的提问来源于stack exchange,提问作者pascal111
相关产品推荐
相关产品推荐

