C语言随机数生成函数异常:生成超范围数值的修复请求
修复C语言猜数字程序的随机数生成异常
问题根源
- 参数顺序颠倒:
randomNumbers函数定义的参数为(int max, int min),但调用时传入的是low(最小值)和high(最大值),导致计算max - min + 1时出现负数。C语言中rand() % 负数属于未定义行为,会生成超出预期范围的随机数。 - 重复初始化种子:
srand(time(NULL))放在randomNumbers函数内部,每次调用都会重置随机数种子。短时间内多次调用时,time(NULL)返回相同秒数,会导致生成重复随机数。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 修正参数顺序:先传入最小值,再传入最大值 int randomNumbers(int min, int max){ int number; number = rand() % (max - min + 1) + min; return number; } void guessingnumber (){ int storednum, low, high, userGuess; printf("请输入最小值:"); scanf("%d", &low); printf("请输入最大值:"); scanf("%d", &high); storednum = randomNumbers(low, high); printf("我们已经选好了一个%d到%d之间的数,请猜一猜:", low, high); scanf("%d", &userGuess); while (userGuess != storednum){ if(userGuess < storednum){ printf("猜小了,再大一点:"); scanf("%d", &userGuess); } else{ printf("猜大了,再小一点:"); scanf("%d", &userGuess); } } printf("恭喜你猜对了!这个数就是%d!", storednum); } int main(){ srand(time(NULL)); // 随机数种子仅在程序启动时初始化一次 guessingnumber(); return 0; }
关键修复点
- 调整
randomNumbers的参数顺序,让调用时的low(最小值)对应函数的min参数,high(最大值)对应max参数,确保max - min + 1为正数,取模逻辑正常生成指定范围内的随机数。 - 将
srand(time(NULL))移到main函数中,仅执行一次初始化,避免重复重置种子导致的随机数异常。
内容的提问来源于stack exchange,提问作者original gamer
相关产品推荐
相关产品推荐

