猜数字游戏(C语言)
猜数字游戏
编译环境VS2017
猜数字游戏,顾名思义,是需要人们猜测一个未知但已确定的数,此问题中还规定了范围0~99。其中,这个未知但要确定的数就要由编写程序来产生,当这个数生成后我们猜数字,程序告诉我们猜的高了,低了,或猜对了来提示我们猜数。
这个未知但已确定的数我们可以用随机数来代替,运用rand()函数可以产生产生随机数,但产生的随机数并不是真正意义上的随机数,因为rand的内部实现是用线性同余法做的,他并不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的。
rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand ()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。
srand()用来设置rand()产生随机数时的随机数种子。其参数必须是个整数,通常可以利用time(0)的返回值来当做参数。如果每次参数都设相同值,rand()所产生的随机数值每次就会一样。
例如:当不设置随机数种子时每次产生随机数都一样,如下
int num[10];
for (int i =0; i < 10; ++i) {
num[i] = rand()%100;
printf("%d\t", num[i]);
}
这段代码每次运行产生的随机数列都不变如下:
当设置变化的随机种子后
即添加代码srand((unsigned int)time(0));
int num[10];
srand((unsigned int)time(0));
for (int i =0; i < 10; ++i) {
num[i] = rand()%100;
printf("%d\t", num[i]);
}
即运行结果为:
再次运行结果为
可以看出,设置变化的时间戳作为随机种子后生成的随机数组不再重复
需要注意的是time(0)返回值与srand()中参数类型并不同,srand()中参数类型为unsigned int型,为避免警告,需要进行类型强制转换
具体实现如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void Menu() {
printf("**************************\n");
printf(" 1.开始游戏\n");
printf(" 0.退出游戏\n");
printf("**************************\n");
printf("请输入您的选择\n");
}
void fun() {
int x;
srand((unsigned int)time(0));//用时间戳来改变每次产生的随机数序列
int to_guess = rand() % 100;//产生0到99的随机整数
while (1) {
printf("请输入您猜的数字\n");
scanf("%d", &x);
if (x > to_guess) {
printf("高了\n");
}
else if (x < to_guess) {
printf("低了\n");
}
else {
printf("猜对了\n");
break;
}
}
}
int main() {
int num;
Menu();
scanf("%d", &num);
system("cls");
if (num == 1) {
fun();
}
if (num == 0) {
printf("再见!\n");
}
system("pause");
return 0;
}
运行结果如下:
再次运行后: