C++使用srand(time(0))设随机种子生成0-9不重复数时程序偶发卡死
问题原因
程序卡死和srand(time(0))本身无关,核心bug是重复计数变量countSameNums的重置逻辑位置错误,你观察到的两种现象只是不同输入序列触发了不同代码路径:
- 你当前的逻辑里,只有当生成的随机数不重复、成功插入vector时,才会把
countSameNums重置为0。一旦某一轮生成的随机数和vector内已有元素重复,countSameNums累加后不会被重置,会一直保留非0值。 - 触发死循环的具体流程:假设vector中已经存入若干元素,某一轮生成了重复值,
countSameNums累加到1,因为不满足插入条件不会执行重置;后续轮次哪怕生成了完全不重复的新值,遍历vector时不会给countSameNums累加,这个值会一直保持为1,永远满足不了countSameNums == 0的插入条件,vector长度永远到不了4,程序就卡在无限循环里。
两种运行表现的本质原因:
- 注释掉
srand(time(0))时,C++标准库默认使用固定值1作为随机数种子,生成的随机序列完全固定,且这个固定序列的前4个值对10取模后刚好互不重复,整个循环过程从来没触发过重复分支,countSameNums从头到尾都是0,自然不会卡死,但输出序列永远不变。 - 保留
srand(time(0))时,种子随当前秒级时间戳变化,生成的随机序列不固定:如果当前种子对应的随机序列前4个模10的值刚好全不重复,全程不触发重复分支,程序就正常运行;如果序列在凑够4个不重复值之前出现过一次重复,就会触发上述计数不重置的bug,直接进入死循环无响应。
修正方法
把计数变量的重置逻辑移到每轮生成随机数、开始统计重复之前即可,更推荐直接用布尔值标记重复,避免计数变量忘重置的问题,核心代码修改如下:
#include <iostream> #include <cstdlib> #include <ctime> #include <vector> using namespace std; int main() { vector<int> vect; int randNums = 4; int randNumber; srand(time(0)); while (vect.size() < randNums) { randNumber = rand() % 10; bool isDuplicate = false; for (int num : vect) { if (num == randNumber) { isDuplicate = true; break; // 找到重复直接终止遍历,减少不必要计算 } } if (!isDuplicate) { vect.push_back(randNumber); } } for (int el : vect) { cout << el << endl; } return 0; }
内容的提问来源于stack exchange,提问作者diegus
相关产品推荐
相关产品推荐

