6.生成随机数、猜数字游戏(rand函数、srand函数、time函数)

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;
}

运行效果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45657848/article/details/132005256