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

如何验证用户输入与生成的随机数是否一致?C语言程序求助

问题:如何高效验证用户输入的随机数序列是否正确?

我写的代码会生成5个随机数,展示5秒后清屏,让用户猜测这些数字。现有代码如下,但尝试用scanf验证时结果总是错误,逐个验证又觉得效率低,想请教如何正确且高效地验证用户输入是否与生成的随机数一致。

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

main()
{
    menuchoose1();
    
}

int menuchoose1(){
    int menu1choose;
    int score=0;
    int mode,i,j;
    int n=5;
    printf("1.Continuous Mode\n");
    printf("2.Stage Mode\n");
    scanf("%d",&menu1choose);
    
    switch(menu1choose){
    int answers;
            case 1:
                srand(time(NULL)* getpid() );
                int a[5];
                unique(a,5,10,99);
                int i;
                printf("You have 5 seconds to remember these numbers\n");               
                for(i=0;i<5;i++)
                printf("%d\t",a[i]);
                sleep(5);
                system("cls");
                scanf("%d",&answers);
                if(answers==a[i]){
                    printf("Correct");
                }else
                    printf("Incorrect");
                break;
        }
    return;
}

void unique(int array[], int length, int min, int max){
    
    int new_randomnum;
    bool unique;
    int i;
    for(i=0;i<length;i++){
        do{
            new_randomnum = (rand()%(max - min + 1 )) + min;
            unique = true;
            int j;
            for(j=0;j<0;j++)
            if(array[j] == new_randomnum) unique = false;
        }while(!unique);
        array[i] = new_randomnum;
    }
}

问题分析

你的代码存在几个关键错误,导致验证失效:

  1. 输入读取错误:scanf("%d",&answers)只能读取单个整数,但用户需要输入5个数字;后续answers==a[i]中的i是循环结束后的5,属于数组越界访问,必然得到错误结果。
  2. 随机数唯一性失效:unique函数中for(j=0;j<0;j++)的循环条件永远不成立,根本不会检查已生成的数字,无法保证随机数唯一。
  3. 头文件缺失:使用time(NULL)需要包含<time.h>,否则会触发编译警告或错误。
  4. 函数声明缺失:menuchoose1在main调用前未声明,部分编译器会报错。

修复方案(正确且高效的验证方式)

以下是修复后的完整代码,核心优化点包括:

  • 读取用户输入的5个数字到数组,与生成的随机数数组逐一比对
  • 修复unique函数的唯一性检查逻辑
  • 补全缺失的头文件和函数声明
  • 修正变量作用域与数组越界问题
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>   // 补全time函数所需头文件
#include<unistd.h> // sleep函数所需头文件(Windows可替换为<windows.h>)

// 提前声明函数
int menuchoose1();
void unique(int array[], int length, int min, int max);

int main() // 修正main函数返回类型
{
    menuchoose1();
    return 0;
}

int menuchoose1(){
    int menu1choose;
    int score=0;
    int i;
    int n=5;
    printf("1.Continuous Mode\n");
    printf("2.Stage Mode\n");
    scanf("%d",&menu1choose);
    
    switch(menu1choose){
        case 1:
            srand(time(NULL) * getpid()); // 用时间+进程ID初始化随机种子
            int a[5];
            unique(a,5,10,99);
            
            printf("You have 5 seconds to remember these numbers\n");               
            for(i=0;i<5;i++){
                printf("%d\t",a[i]);
            }
            fflush(stdout); // 强制刷新输出缓冲区,避免延迟显示
            sleep(5);
            system("cls"); // Windows清屏,Linux/macOS替换为"clear"
            
            // 读取用户输入的5个数字
            int user_answers[5];
            printf("Enter the 5 numbers you remembered (separated by spaces):\n");
            for(i=0;i<5;i++){
                scanf("%d", &user_answers[i]);
            }
            
            // 高效验证:遍历数组比对所有元素
            bool all_correct = true;
            for(i=0;i<5;i++){
                if(user_answers[i] != a[i]){
                    all_correct = false;
                    break; // 发现错误立即终止循环,提升效率
                }
            }
            
            if(all_correct){
                printf("Correct!\n");
                score += 10; // 可根据需求加分
            }else{
                printf("Incorrect!\n");
                printf("The correct sequence is: ");
                for(i=0;i<5;i++){
                    printf("%d\t",a[i]);
                }
                printf("\n");
            }
            break;
        case 2:
            // 可补充Stage Mode的逻辑
            printf("Stage Mode not implemented yet.\n");
            break;
        default:
            printf("Invalid choice!\n");
            break;
    }
    return score;
}

void unique(int array[], int length, int min, int max){
    int new_randomnum;
    bool unique;
    int i, j;
    for(i=0;i<length;i++){
        do{
            new_randomnum = (rand() % (max - min + 1)) + min;
            unique = true;
            // 检查已生成的所有元素,确保唯一性
            for(j=0;j<i;j++){
                if(array[j] == new_randomnum){
                    unique = false;
                    break; // 发现重复立即终止检查
                }
            }
        }while(!unique);
        array[i] = new_randomnum;
    }
}

关键优化说明

  1. 输入读取:用循环读取5个整数到user_answers数组,确保获取完整的用户输入序列。
  2. 高效验证:遍历两个数组,一旦发现不匹配就终止循环,避免不必要的比对,时间复杂度为O(n),是最优的线性比对方式。
  3. 随机数唯一性修复:将unique函数中的循环条件改为j<i,每次生成新数字时检查已存入数组的所有元素,确保没有重复。
  4. 输出缓冲区刷新:添加fflush(stdout)避免随机数在sleep前未显示的问题。

内容的提问来源于stack exchange,提问作者Capooch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:01:15