You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言随机数生成函数异常:生成超范围数值的修复请求

修复C语言猜数字程序的随机数生成异常

问题根源

  1. 参数顺序颠倒:randomNumbers函数定义的参数为(int max, int min),但调用时传入的是low(最小值)和high(最大值),导致计算max - min + 1时出现负数。C语言中rand() % 负数属于未定义行为,会生成超出预期范围的随机数。
  2. 重复初始化种子: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:28:14