C语言生成1-4无重复随机数遇问题:数量波动且存在重复
解决C语言生成1-4无重复随机数的问题
看起来你的代码里有几个关键错误导致了重复输出和程序提前终止的问题,我来一步步帮你梳理和修复:
问题分析
指针遍历逻辑完全错误
在checkarray函数里,你用*(x - 2 * r)来对比之前的元素,这完全偏离了正确的数组遍历方式。比如当i=1(当前元素是a[1]),x是&a[1],你应该对比的是x-1(也就是a[0]),而不是x-2*1——这会指向数组外的未知内存,导致随机错误。误用
exit(0)导致程序提前终止
一旦检测到重复,你调用exit(0)直接结束了整个程序,这就是为什么有时候输出的数字数量不到4个的原因——程序中途就退出了,而不是重新生成当前位置的随机数。主程序的输出换行多余
你在非第一个元素的输出里加了\n,这会导致每个数字换行显示,和你预期的连续输出不符。
修正后的代码
#include <stdio.h> #include <stdlib.h> // srand和rand需要的标准头文件 #include <time.h> // time函数需要的标准头文件 #include <conio.h> int checkarray(int *x, int y); int main() { // 标准C规范中main函数应返回int类型 int a[4], i = 0, check; srand((unsigned int)time(0)); // 强转参数类型避免编译警告 while (i < 4) { a[i] = rand() % 4 + 1; if (i == 0) { printf("%d ", a[i]); i++; continue; } check = checkarray(&a[i], i); if (check == 1) { printf("%d ", a[i]); i++; // 只有数字有效时才递增索引 } // 否则不执行i++,重新生成当前位置的随机数 } getch(); return 0; // 标准main函数的返回值 } int checkarray(int *x, int y) { int apply = 1; // 从当前元素的前一个开始,往前遍历所有已生成的元素 for (int r = 1; r <= y; r++) { if (*x == *(x - r)) { apply = 0; break; // 找到重复立即退出对比循环 } } return apply; }
关键改进说明
- 修复了
checkarray的遍历逻辑:通过x - r依次访问当前元素之前的所有元素,确保重复检查的正确性。 - 替换
exit(0)为break:只退出对比循环,不会终止整个程序,让主程序可以重新生成当前位置的随机数。 - 调整
i++的执行时机:只有当当前生成的数字通过重复检查时,才递增索引,否则重新生成当前位置的数字。 - 补充标准头文件并修正
main函数的返回类型,符合C语言的标准规范。
这样修改后,程序就能稳定生成1-4的无重复随机数,输出类似3 1 4 2这样的结果。
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

