【C语言】猜数字小游戏——深度刨析rand函数生成随机数

目录

一.制作菜单menu

二.调用menu函数并设置判断

三.编写game函数

1.首先需要生成1~100的随机数

 2.猜数字功能


一.制作菜单menu

定义一个menu函数来打印游戏菜单

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

二.调用menu函数并设置判断

首先在do while内调用menu函数,然后用input接收用户输入并用switch判断,当输入0时退出游戏,输入1时进入游戏,为了防止用户输入0 1 以外的数字,用default进行提示并重新开始输入。此时一个简易的菜单便制作完成。

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

三.编写game函数

1.首先需要生成1~100的随机数

生成随机数是这个游戏最核心的部分。 C语言中提供了一个生成随机数的函数rand(),通过这个函数就可以生成随机数。但是如果只是调用rand函数,大家可以发现一些问题。

void game()
{
	int ret = rand();
	printf("%d\n", ret);
	return 0;
}

  可以发现,第一次运行的结果和第二次运行的结果是一样的,这貌似并不是随机数。这是因为rand函数生成的其实是伪随机数,伪随机数是通过某种算法生成的随机数,因此这个随机数就并不是很“随机”,生成范围是0~RAND_MAX(即32767)。

而正确使用rand函数的方法是,在rand函数产生随机数之前,使用srand函数设置随机数的生成器,srand函数的参数可以叫做种子,类型是unsigned int,头文件为:stdlib.h

  1.当在rand函数之前使用srand(1)设置时,可以发现结果与上面的结果是一致的,这就证明了当只是使用rand函数生成随机数时,其默认种子便是1。一但种子固定了,生成的随机数也就固定了,这也就很好的解释了为什么两次运行出来的随机舒适一致的。

  2.了解完这一点之后,我们就可以想,只要让srand的种子变动起来,那么rand函数生成的随机数便可以随机起来。

我们都知道时间是在不停发生变化的,C语言中提供了一个函数time头文件为:time.h,该函数可以返回一个时间戳,时间戳代表的是当前机器时间相较于计算机的起始时间之间的差值,即1970年1月1日开始到当前时间的差值,单位是秒,通过这个时间戳也可以转换成正常时间。

 

因此只要我们能够获得这个时间戳, 并将它作为srand函数的种子,那么rand函数生成出来的随机数就能真的随机。因为srand函数的参数类型是unsigned int,因此time(NULL)还需要强制类型转换。

 通过以上设置,此时出来的便是随机数了 ,但是此时的随机数范围仍然是0~RAND_MAX(即32767)。需要生成0-100的随机数,只要将rand()%100,就可以得到0~99的数,再在结果后+1,范围便是1~100了。那么生成1~100的随机数就完成了。

 2.猜数字功能

 有了随机数,剩下的就很简单了,只需要判断键盘输入的值与随机数的关系,比随机数大就输出猜大了,比随机数小就输入猜小了,相同则猜对了,那么完整的game函数如下:

void game()
{
	int ret = rand() % 100 + 1;
	int guess = 0;
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);
		if (guess < ret)
			printf("猜小了\n");
		else if (guess > ret)
			printf("猜大了\n");
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
	return 0;
}

如果觉得作者写的不错,求给作者一个大大的点赞支持一下,你们的支持是我更新的最大动力!

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hacynn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值