C语言仅用int、if、while实现1-9无重复4位随机数问题求助
原有代码的问题
- 逻辑运算符使用错误:判断新生成的数位是否和已有数位都不重复时,错误使用了逻辑或
||,应该使用逻辑与&&。比如判断d3的条件写的是d3 != d1 || d3 != d2,这个条件永远为真:哪怕d3等于d1,d3 != d2也会满足,导致重复的数位也能通过校验。 - 未处理d2和d1重复的场景:d2仅在进入while循环前生成一次,如果首次生成的d2和d1相等,while循环会一直空转,永远不会进入后续生成d3、d4的逻辑。
- 变量未定义:
random_4digit没有提前声明类型,直接赋值会触发编译错误。 - 函数返回值不符合要求:函数声明为int类型,代码中没有return语句返回生成的四位数,反而直接在函数内打印结果,不符合函数的设计预期。
正确实现代码
按照你限定的语法规则,不需要用到数组结构,分别为每个数位设置独立的循环校验逻辑即可,示例如下:
int get_random_4digit() { int d1, d2, d3, d4, res; // 生成第一位1-9的数 d1 = rand() % 9 + 1; // 生成第二位,直到和第一位不重复 while(1) { d2 = rand() % 9 + 1; if(d2 != d1) break; } // 生成第三位,直到和前两位都不重复 while(1) { d3 = rand() % 9 + 1; if(d3 != d1 && d3 != d2) break; } // 生成第四位,直到和前三位都不重复 while(1) { d4 = rand() % 9 + 1; if(d4 != d1 && d4 != d2 && d4 != d3) break; } res = d1 * 1000 + d2 * 100 + d3 * 10 + d4; return res; }
如果需要打印结果,可以在函数外接收返回值后打印,调用示例:
// 注意调用rand前需要先设置随机种子,比如srand((unsigned int)time(NULL)); int num = get_random_4digit(); printf("Random 4digit = %d\n", num);
内容的提问来源于stack exchange,提问作者Milton Niklasson
相关产品推荐
相关产品推荐

