生成随机数 ~详细解析

如何生成1~100随机数

最近在写一个如何生成随机数的练习:生成一个1~100的随机数,通过百度我发现到是要调用sand函数来实现的,接下来我们慢慢深入了解吧!
得知我们生成随机数要用到sand函数,但我们并不知道这个函数究竟是如何运行的,接下来我们可以在MSDN里查看这个函数的用法。
生成随机数 ~详细解析_第1张图片通过查看后,得知这个函数会返回一个从0到RAND_MAX的随机整数,对此我并不知道它的数值于是多少,于是我们右键点击转到定义。

#define RAND_MAX 0x7fff

发现define定义的 RAND_MAX大小是0x7fff,转换成十进制也就是32767,也就是说这个函数可以返回一个从0~32767的整型。接下来我们实战一下发现生成随机数 ~详细解析_第2张图片
本以为已经可以生成随机数了,可但是当我第二次运行时发现,它生成的还是这些随机数,也就是说,第一次生成的随机数和第二次生成的是相同的。我这细想肯定出错了,回头看在描述中还有第二句话:在调用rand函数之前,我们要调用srand函数设置生成随机数。对此我又在MSDN中查查srand函数:
生成随机数 ~详细解析_第3张图片
发现srand函数的参数是一个无符号整型并且无返回值,那我们测试一下,随便给srand输入一个无符号整型比如:100。
生成随机数 ~详细解析_第4张图片
当再一次运行的时候,程序还是照样生成一样的随机数,只有通过我们改变传入srand的参数时,生成的随机数才会改变。
生成随机数 ~详细解析_第5张图片
那么问题来了,当我们给srand传入一个随机数,那么rand就会给我们返回一个随机数,想到这里不就出问题了吗?!我们为了生成一个随机数,现在要我们输入一个随机数才行,这不就是先有蛋还是先有鸡的问题嘛!
这时候我们想要给srand传进去一个一直在发生变化的值不就OK了吗?那什么是一直发生变化的呢?我们想到咱电脑上一直在发生变化的~~时间。这时候我们要介绍一个概念:时间戳
时间戳:当前时间相较于计算机起始时间的差值,单位是秒。
生成随机数 ~详细解析_第6张图片
所以我们用时间戳作为随机数的生成器,那么每一个所生成的随机数都是随机的,所以我们可以给srand传一个时间戳,这时候我们就需要用到time函数,C语言提供的time函数,可以返回一个时间戳。
生成随机数 ~详细解析_第7张图片

这里我们可以看到time函数的参数是time_t型指针,返回值是time_t型。通过转到定义发现,是整型和长整型类型,其实time函数最终返回的是一个整数。
在这里插入图片描述
如果创建一个time_t t;即可把t的地址传给参数timer,那么函数就把时间戳的时间放在了t里面,当然这个参数我们也可以不用,于是我们就向time函数传入一个空指针( NULL)即可。当然也可以通过返回值把时间戳返回来,所以我们如果要将time函数的返回值传入srand函数,那么我们就需要将time函数的返回值强制性转化会unsigned int型。
生成随机数 ~详细解析_第8张图片

这样就真正的产生随机数了!但是生成的随机数不在1~100的范围里面。
如何生成规定位数的随机数呢(1~100)

int ret = rand()%100+1;

可知任何一个数字%100余的数字只能取0~99,我们只需要将所得随机数对100取余数,那么我们得到的数就是0-99的数字,这时再加上1便是1-100的数字了。
同理:要生成三位数:

int ret = rand()%1000+1;

以下是猜数字游戏的全部代码

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include


void menu()
{
	printf("******1.play*******\n");
	printf("******0.exit*******\n");
	printf("*******************\n");
	printf("*******************\n");

}
void game()
{
	int guess = 0;
	//1.生成一个随机数
	srand((unsigned)time(NULL));
	int ret = rand()%100+1;

	//2.猜数字 
	
	while (1)
	{
		printf("猜数字:>\n");
	    scanf("%d",&guess);
		if (guess < ret)
		{
			printf("猜小了\n");
		}
		else if (guess > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你猜对了\n");
			break;
		}
	}
}
int main()
{ 
	int input = 0;
	do
	{
		 menu();
		 printf("请选择:>");
		 scanf("%d",&input);
		 switch (input)
		 {
		 case 1:
			 game();
			 break;
		 case 0:
			 printf("退出游戏\n");
			 break;

		 default:
			 printf("选择错误,请重新选择!\n");
			 break;
		 }

	} while (input);
	return 0;
}

那么到这里就已经讲解完啦,如果文中有错误请指出。

你可能感兴趣的:(C语言—展翅计划,c语言,经验分享)