我的代码生成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,但它总是以不正确的结果结束,并且一个一个地生成它,然后一个一个地检查它将是低效的。
2条答案
按热度按时间bqjvbblv1#
首先,这个程序会产生a ton of compiler warnings。我强烈建议你养成启用警告的习惯,永远不要忽略它们!例如,你丢失了很多头文件和前向声明。如果你的编译器没有给予你这些警告,那么你应该考虑换一个更好的。
下面我只会提到那些不会触发警告的bug。
如果你在每一轮游戏中调用
srand
,你可能会再次得到相同的数字序列。只要在程序开始时调用一次,例如在main
中。我修正了缩进以强调这个bug。
if(answers == a[i])
在循环之后,因此当到达i
时,它的值总是5,这超出了数组a
的界限,导致未定义的行为。您可能希望代码在自己的循环中获取并检查用户的答案。j<0
条件表示此循环将永远不会执行。您可能是指j<i
。qgelzfjb2#
OP代码的一部分的详细信息。
srand(time(NULL)* getpid() );
是初始化随机数生成器的弱方法。例如:如果
time(NULL)
或getpid()
的最低有效位为0,则与的乘积的最低有效位为0。因此,该位有75%的变化为0。相反,在循环之前调用一次
srand()
,并使用如下2个函数调用:通过使用^
,位将不会如上文所论述而被偏置。