C语言 我应该使用什么来检查用户的输入是否与生成的随机数相同?

iaqfqrcu  于 2022-12-11  发布在  其他
关注(0)|答案(2)|浏览(144)

我的代码生成5个随机数,我希望用户在 Flink 5秒后猜测这些数字。

#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;
    }
}

我尝试过使用scanf,但它总是以不正确的结果结束,并且一个一个地生成它,然后一个一个地检查它将是低效的。

bqjvbblv

bqjvbblv1#

首先,这个程序会产生a ton of compiler warnings。我强烈建议你养成启用警告的习惯,永远不要忽略它们!例如,你丢失了很多头文件和前向声明。如果你的编译器没有给予你这些警告,那么你应该考虑换一个更好的。
下面我只会提到那些不会触发警告的bug。

srand(time(NULL)* getpid() );

如果你在每一轮游戏中调用srand,你可能会再次得到相同的数字序列。只要在程序开始时调用一次,例如在main中。

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;

我修正了缩进以强调这个bug。if(answers == a[i])在循环之后,因此当到达i时,它的值总是5,这超出了数组a的界限,导致未定义的行为。您可能希望代码在自己的循环中获取并检查用户的答案。

for(j=0;j<0;j++)
            if(array[j] == new_randomnum)
                unique = false;

j<0条件表示此循环将永远不会执行。您可能是指j<i

qgelzfjb

qgelzfjb2#

OP代码的一部分的详细信息。
srand(time(NULL)* getpid() );是初始化随机数生成器的弱方法。
例如:如果time(NULL)getpid()的最低有效位为0,则与的乘积的最低有效位为0。因此,该位有75%的变化为0。
相反,在循环之前调用一次srand(),并使用如下2个函数调用:通过使用^,位将不会如上文所论述而被偏置。

相关问题