游戏要求:生成一个随机数,范围在1~100之间,根据猜到的数字大小给出反馈,直到猜中为止。
1.rand函数
rand()这个函数可以生成一个随机数,但要注意,rand()函数生成的是伪随机数。这个随机数的范围是在0~RAND_MAX之间,RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767。
rand()函数的函数原型:
int rand(void);
使用:rand()函数不需要参数。
实际上多运行几次程序就会发现,说是rand()函数会生成随机数,但是程序每次输出的值都是一样的。因为rand()函数是对一个叫“种子”的基准值进行运算生成的随机数。在不设置种子的情况下,种子默认为1,如果要生成不同的随机数,就要让种子是变化的。此时就需要用到另一个函数:srand()来设置种子。
补充:随机数可分为真随机和伪随机。
真随机:本质上是不可预测的,没有规律
伪随机:通过确定性算法生成的序列,看似随机但实际可复现。
2.srand函数
srand()函数用来初始化随机数的生成器的。
基本原型:
void srand (unsigned int seed);// seed就是种子
程序中在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,rand()函数生成的数字就在变化。rand()函数生成的伪随机数序列是由srand()设置的种子决定的。
使用:
因此只要保证srand()里边的种子随机,就能做到rand()函数生成随机数,但是用随机数生成随机数套娃有点离谱,所以只要保证srand()函数里边的种子只要时刻在变化就好,这点利用time函数就可以做到。
3.time函数
使用srand()函数时可以用时间来当做种子,因为时间是时刻都在变化的。
time函数基本原型:
time_t time(time_t *timer);
time函数可以返回一个时间戳。时间戳指的是:19701月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。其中time_t*是一个指针类型,time_t是函数返回值类型,是时间类型,但是本质是无符号整型类型。如果传入NULL,函数仍会返回当前时间,但不会通过指针存储结果。如果传入非NULL的指针,时间值会同时存入该指针指向的变量。
举例:
4.随机数的范围
若想指定随机数的范围可以使用%。
举例:生成0~99范围内的随机数
rand()%100// 一个数取余100的所有结果是0~99
想要生成1~100的数就可以让生成的随机数+1,范围就从0~99变为1~100.
rand()%100+1;
由上可得一个公式:rand() %(b-a+1)
生成a~b之间的随机数
1. rand() %(b+1);
//先取余b+1得到b之前的余数,此时范围是0~b.
2. rand() %(b+1) + a;
//但是最小值要从a开始,因此可以左右两边的数字同时加a,得到的范围就是a~b+a.
3. rand() %(b-a+1) + a;
// 想要解决这个问题,就要把右边的范围减去一个a,此时范围正好
简洁版:想要生成a~b的范围,就需要生成的余数范围控制在[0~b-a],所以需要rand() %(b-a+1),此时再加a的范围就控制在了[a~b]
结果展示:
加入次数限制:
完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h> // 使用rand()和srand()函数 需要包含的头文件
#include <time.h> // 使用time函数需要包含的头文件
void menu() // 菜单
{
printf("请选择是否开始游戏\n");
printf("---- 1.play ----\n");
printf("---- 0.exit ----\n");
printf("请选择:");
}
void game() // 游戏实现
{
int ret = rand()%100+1; // 控制生成数范围
int guess = 0; // 你要猜的数字
int count = 6; // 次数限制
printf("游戏开始!生成数字范围在(1~100)\n");
while (count)
{
printf("输入你的数字:");
scanf("%d", &guess);
if (guess > ret)
{
printf("数字大了\n");
}
else if (guess < ret)
{
printf("数字小了\n");
}
else
{
printf("猜对了\n");
break;
}
count--; // 每猜一次数字-1
printf("还有%d次机会\n", count);
}
printf("差一点点\n"); //写在循环外,循环自然结束表示次数归零,输出差一点
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); // 设置种子,写在主函数中只需要调用一次
/*若是放在自定义函数game()中,则每次游戏开始都会初始化一次srand.用户短时间内连续开始新的游戏,时间戳的值可能会保持不变,导致每次随机数结果相同*/
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("请重新输入正确数字\n");
}
} while(input);
return 0;
}
完。