作者:低调
作者宣言:认真写好每一篇博客
作者gitee:link
前言
今天作者又来更新好文了,今天我们就讲计算机时怎么生成随机数字的,并且在设计一个猜数字小游戏,来达到实践的目的,接下来进入正文:
一、如何生成随机数
这里我们需要使用到一个函数rand(),这是一个生成随机数的函数,我们来具体看他的用途:
我们可以看到rand函数是一个无参的,返回int整型数据。他需要的头文件是<stdlib.h>,让我们来看一下代码和运行截图
#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>
int main()
{
while (1)//循环时为了看到多次随机生成的数
{
int ret = rand();//生成随机数,用ret来接收
printf("%d\n", ret);
Sleep(1000);//这是一个睡眠函数,单位时毫秒
}
return 0;
大家可以看到生成的数是随机的了,但是这里有一个问题,作者没办法把录屏放到博客上,所以看不到直观现象,读者可以把这段代码复制在自己的编译器上运行几篇可以发现,每次生成随机数的结果是一致的,那这样随机数不久不随机了??并且生成的随机数只在0-RAND_MAX之间
大家可以看到RAND_MAX是一个32767的数。那我们怎末解决这个问题呢,其实在使用这个函数之前,我们再来看看rand这个函数使用还需要哪些条件
画红线的地方提示我们,在使用之前需要一个srand()函数,那我们再来看看srand()怎么使用的吧:
我们看到返回值是空类型,所以没有返回值,参数是一个无符号整型unsigned int,为什么在使用rand之前之前,要使用这个函数呢,因为这个函数是用来设置随机数生成器的。那我们来看代码理解一下。
看这两次运行结果,虽然结果不一样了,但还是有问题,如果srand里面的参数不变,他每次生成的随机数还是和上次一样,如果多次运行程序,那生成的就不是随机数了,所以我们需要使srand里面的参数随机就行了,我们需要生成随机数啊,为什么参数还需要随机数啊,这不就矛盾了吗,不要慌,我们这个时候就要引入时间戳这个概念。
只有时间是一直在改变的,我们就要用到time这个函数,他的返回值就是返回一个时间戳的值
这里的参数是一个指针类型,我们目前在使用这个之前只需要传一个NULL就好了。我们只需要知道怎么使用就好了,不需要过多的研究他。
来看代码:
#include<stdlib.h>
#include<stdio.h>
#include<Windows.h>
int main()
{
srand((unsigned int)time(NULL));
while (1)//循环时为了看到多次随机生成的数
{
int ret = rand();//生成随机数,用ret来接收
printf("%d\n", ret);
Sleep(1000);//这是一个睡眠函数,单位时毫秒
}
return 0;
}
这是两次运行的截图,大家看到,结果不一样了,你不管运行几次,生成的随机数都是不一样的,这样是不是就很好的解决这个问题了。
注意:我们在使用rand函数之前的srand只需要调用一次,如果把srand函数放到循环里面就会出现问题
这些数字好像又不是随机的,因为每次调用,srand里面的参数重新改变,并且时间是一点一点往上涨,也就相当于每次都重新设置起点,达不到随机的效果。
二、猜数字小游戏
我们需要在1-100之前猜数字
先来看代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("**********************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
int random_num = rand() % 100 + 1;
int input = 0;
while (1)
{
printf("请输入猜的数字>:");
scanf("%d", &input);
if (input > random_num)
{
printf("猜大了\n");
}
else if (input < random_num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
我们在game()函数里面看到while循环是你猜的数,我们千万不能把rand函数放在while里面不然每次猜的时候都生成一个随机数,这样永远都猜不到,rand%100+1是因为余数最多为99在加以就是100了,srand函数在一次程序运行时只需要调用一次就好了,所以放在一开始就好了。
读者可以自己下去玩玩这个小游戏。
三、总结
今天我们学会如何生成了一个随机数,并且还实现了一个猜数字的小游戏,我们知道了每个函数都有特定的功能,并且也了解他的重要性,如果读者有什么不懂的问题可以随时评论,我会及时答疑,如果有写的不对的地方,也希望大佬指出来,作者会及时改正。最后希望大家多多支持我