猜数字游戏
- 1.生成随机数
- 1.1 rand函数
- 1.2 srand函数
- 1.3 time函数
- 1.4 设置随机数的范围
- 2.猜数字游戏
1.生成随机数
1.1 rand函数
函数原型如下:
int rand(void);
所需头文件:stdlib.h
作用:调用后随机返回一个伪随机数,随机数范围为0~RAND_MAX之间,大部分编译器上为32767(rand函数 ctrl+鼠标左键 打开 里面定义为:#define RAND_MAX 0x7fff)
伪随机数:之所以是伪随机数,是因为rand()函数是基于一个叫"种子(seed)"的基准值运算生成随机数的。
关于种子seed:rand函数中默认种子基准值为1
所以要使用srand()函数(后面会提到)来初始化seed的基准值
示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
我这里调用了3次rand函数,结果如下:
41
18467
6334
接下来我又重新反复执行程序多次,结果随机数没变,一直是这几个数
这里就是所谓的伪随机数,所以,通过调用srand()函数改变**种子(seed)**来实现随机数的真正变化
1.2 srand函数
函数原型如下:
void srand(unsigned int seed);
srand()中参数为一个非负的整型seed
这个非负的整型seed,就是所谓的种子,决定rand()函数返回的随机数
作用:初始化随机数的生成器
函数本质:即srand(unsigned int seed)中seed得是随机的,rand()函数才能生成真正的随机数
问题:听上去是不是有点矛盾?
rand()生成随机数 需要seed为随机值,
srand(seed)定义seed时,也需要一个随机值,rand的随机数都还没生成,那随机数哪里来呢?
解决方法:只要seed值时刻发生变化,就可以使rand调用函数时每次都不一样
所以接下来要用到time()函数
1.3 time函数
原因:使用程序运行的时间来作为种子的初始值,因为时间时刻在发生变化
函数原型如下:
time_t time(time_t * timer);
所需头文件:time.h
作用:time()函数 参数为NULL时,返回当前时间戳;如果timer为非NULL指针的话,函数会将时间戳放到timer指向的内存中带回去
时间戳:即1970年1月1日0时0分0秒到现在程序运行的时间差值,单位是秒
返回类型为time_t,本质上就是long(32位长整型)或者long long(64位长整型)
示例:生成随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
//time()函数 参数为NULL时,返回当前时间戳,作为种子
//因为srand函数的参数时unsigned int类型,所以将time函数的返回值类型强制转换
unsigned int seed = (unsigned int)time(NULL);
//初始化seed
srand(seed);
//调用rand() 并打印随机数
printf("调用随机值(整型):%d\n", rand());
return 0;
}
结果:随着时间时刻在变化,每次生成的随机数都不一样
注:srand函数在一个程序中只需要调用一次即可,不需要反复调用!
1.4 设置随机数的范围
例如:我们要生成0~99之间的随机数,方法如下
rand() % 100;//余数的范围为0~99
原理:
rand()返回值的范围为0-32767,按照位数来看,范围为【万位~个位】
万位级别的数 % 100 = 此数后两位 例:32699 % 100 = 99 32600 % 100 = 0
千位级别的数 % 100 = 此数后两位 例:3299 % 100 = 99 3200 % 100 = 0
百位级别的数 % 100 = 此数后两位 例:199 % 100 = 99 100 % 100 = 0
个、十位级别的数 % 100 = 此数本身 例:99 % 100 = 99 0 % 100 = 0
根据上述结论,要生成1~100之间的随机数,方法如下
rand() % 100 + 1;//余数的范围为1~100
若要生成100~200之间的随机数,方法如下
100 + rand() % (200 - 100 + 1);//余数的范围为0~100,加100后就是100~200
总结:如果要生成a-b之间的随机数,方法如下
a + rand() % (b - a + 1);
2.猜数字游戏
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game() {
int num = rand() % 100 + 1;//生成随机数(范围1-100)
int guess = 0;//初始化 输入猜的数字
int count = 5;//设置挑战次数
while (count)
{
printf("你还有%d次机会,请输入你猜的数字:",count);
scanf("%d", &guess);
if (guess < num)
{
printf("猜小了\n");
}
else if (guess > num)
{
printf("猜大了\n");
}
else
{
printf("猜对了!\n");
break;
}
count--;
}
if (count == 0)
{
printf("你失败了,正确答案是:%d\n",num);
}
}
void menu() {
printf("********************\n");
printf("*** 1.开始游戏 ***\n");
printf("*** 2.退出游戏 ***\n");
printf("********************\n");
}
int main() {
int input = 0;
srand((unsigned int)time(NULL));//初始化种子,让rand()可以调用随机数
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 2:
printf("游戏结束\n");
//这里的break跳出的是switch结构,不用goto弹出游戏结束后还会继续循环菜单
goto out;
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
out:
printf("成功退出游戏");
return 0;
}
运行效果