C语言如何 生成随机数?(过程逐步分析)

先给大家分享一个查阅函数的网站:cplusplus.com - The C++ Resources Network

我们通过一道题讲解:实现1-100的猜数字游戏

先将代码大框架罗列出来:

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

void game()
{

}

void test()
{
	int input = 0;
	//注意:input不能定义在循环里面,否则条件判断无法进行
	//上来循环得先走一遍,所以用do-while
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("输入错误,重新输入:\n");
			break;
		}
	} while (input);//如果input非0为真,就再次进入循环
}

int main()
{
	test();
	return 0;
}

一.如何产生随机值

1. rand 函数

rand函数是专门用来生成随机数的,返回的是0~RAND_MAX(32767)之间的一个随机数,需要头文件 #include <stdlib.h>

RAND_MAX是一个值   #define RAND_MAX 0x7fff

 用 int 类型来接收

void game()
{
	//1.生成随机数
	int ret = rand();
	printf("%d\n", ret);
	//2.猜数字
}

 每玩一次游戏,生成一个随机数打印。但是我们发现,每次运行程序,生成的随机数都是一样的,有问题。

2. srand 函数

rand 函数使用前,要调用另一个函数:srand,来设置随机数的生成起点

 这里需要给 srand 传一个整数值,那我们给它个0

void game()
{
	srand(0);

	//1.生成随机数
	int ret = rand();
	printf("%d\n", ret);
	//2.猜数字
}

但这样每次都是38,生成的数不够随机了

那我们这样:

srand(1)

srand(100)

发现:值分别变成了 41 和 365

确实变起来了,所以我们要给 srand 传一个变化的值,电脑上时间一直变化,能不能把时间传进去?

3.时间戳

只要时间在变化,时间戳就在变化,怎么传时间戳呢?

4. time 函数

C语言中,time函数会返回时间戳,srand 需要传一个整型,谁给呢?time 函数

 

这里的返回值 time_t 本质上是 long long 整型,只是重命名成 time_t 了

需要一个参数,参数是指针,我们不管他,只需要让 time 返回一个值给我们,给他传一个空指针 NULL

需要头文件:#include <time.h>

srand(time(NULL));

这里编译器警告:“函数”: 从“time_t”转换到“unsigned int”,可能丢失数据。

time 函数返回 time_t ,我们把他强制转换为 unsigned int 

void game()
{
	srand((unsigned int)time(NULL));

	//1.生成随机数
	int ret = rand();
	printf("%d\n", ret);
	//2.猜数字
}

运行起来,生成的都是随机数,但是都非常临近。如果按得快,甚至生成的随机数是一样的,还是不够随机

其实,srand 设置随机数生成起点,只要被调用一次就可以了(有一个起点就行)

srand函数在程序中只要调用一次就可以了,不需要频繁调用

上面的代码玩一次游戏,起点就重新设置。所以将 srand 放到 test 函数里,只调用一次

二.缩范围

rand 函数返回 0-32767,但我只要1-100

这样做:

void game()
{
	//1.生成随机数
	int ret = rand()%100+1;
	printf("%d\n", ret);
	//2.猜数字
}

rand()%100   ——  0-99

三.整体代码

将游戏 2.猜数字 部分补充完整。下面展示完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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

void game()
{
	int num = 0;

	//1. 生成随机数
	int ret = rand()%100+1;
	//printf("%d\n", ret);

	//2. 猜数字
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了\n");
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}

void test()
{
	srand((unsigned int)time(NULL));

	int input = 0;

	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("输入错误,重新输入:\n");
			break;
		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注

小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。