Visual Studio中C++随机数生成器运行2次后停止生成数字问题
排查你的随机数程序卡住问题
嘿,作为编程新手碰到这种小状况太正常了——谁没在入门时踩过几个低级坑呢!咱们来一步步拆解你可能遇到的问题:
最可能的原因:死循环在找“不存在的新数”
你要生成1-3的不重复随机数,最容易踩的坑就是生成逻辑不小心导致死循环。比如:
- 如果你的代码里,在第三次选数时,错误地判断了“已使用”的条件,或者标记已使用数字的数组没正确更新,程序就会一直循环试图找一个没被用过的数,但1-3已经全被选完了(或者你的逻辑误以为全被选完了),于是程序就卡在这里,只剩控制台光标闪烁。
举个典型的错误代码例子(你可能类似这么写了):
int used[3] = {0}; int num; for(int i=0; i<3; i++){ do{ num = rand() % 3 + 1; // 这里如果不小心把判断写反了,或者下标写错,就会出问题 }while(used[num] == 1); // 注意!这里下标应该是num-1,因为数组是0开始的! used[num-1] = 1; // 显示表格 }
上面的代码里,used[num]会越界(当num=3时,访问used[3],但数组只有0-2下标),导致内存乱码,第三次循环时可能永远满足while条件,直接死循环。
另一个可能:随机种子没初始化
如果你的程序开头没写srand((unsigned int)time(NULL));,每次运行程序生成的随机序列都是固定的。虽然这一般不会直接导致卡住,但如果这个固定序列刚好在第三次运行时触发了你的逻辑bug(比如刚好连续生成重复数,进入死循环),也会出现你说的情况。
解决方法&正确示例
先给你一个能正常运行的代码模板(假设你用的是C语言,入门课常用):
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 关键!初始化随机种子,只需要调用一次,放在程序最开头 srand((unsigned int)time(NULL)); int used[3] = {0}; // 标记1-3是否被使用:used[0]对应1,used[1]对应2,used[2]对应3 int selected_num; // 生成3个不重复的随机数 for (int i = 0; i < 3; i++) { do { selected_num = rand() % 3 + 1; // 生成1-3的随机数 } while (used[selected_num - 1] == 1); // 跳过已使用的数 used[selected_num - 1] = 1; // 标记为已使用 printf("现在显示表格%d\n", selected_num); } return 0; }
同时给你几个新手调试小技巧:
- 在循环里加
printf,比如每次生成selected_num后打印它,以及used数组的状态,这样你就能看到第三次程序是不是卡在循环里了 - 如果程序里有
system("pause")或者getchar(),可以在之前加fflush(stdin)(VS环境下可用),清空输入缓冲区的残留字符,避免因为意外输入导致程序卡住
别担心,这种小问题解决后,你对循环和随机数的理解会更深刻的!
内容的提问来源于stack exchange,提问作者bbrand0n
相关产品推荐
相关产品推荐

