C语言入门练习篇——猜数游戏

目录

1.游戏规则

2.分析问题

3.思考对策

3.1 生成随机数——rand 函数

  3.2 rand 函数的伪随机性

3.2.1 种子

3.2.2 算法

3.3 srand()+time()实现理论上的随机

3.3.1 srand()函数

3.3.2 time()函数

3.3.3 大功告成:srand (time(NULL))

3.4 其他部分

4.代码编写


1.游戏规则

执行程序,程序会随机生成一个1-100的数字,然后用户猜这个数字为多少。计算机给出提示,是大了还是小了,直到找到正确答案。

2.分析问题

那么我们该如何实现呢,从前往后看,我们第一步需要让计算机生成一个随机数,然后存储下来,接着我们需要再将用户输入的数存储下来,与生成的数进行对比,并返回比较结果生成对用户的提示,以此类推,直到找到正确答案。

3.思考对策

3.1 生成随机数——rand 函数

在C语言中,rand()函数是一个标准库函数,用于生成伪随机数,在使用的时候我们需要使用头文件:<stdlib.h>

我们可以这样使用:

运行以后我们看到生成的数是41。好像生成随机数这个任务已经完成了,但是事实真的如此吗?

假设我们我们已经玩完一局了,我们重新执行程序再玩一局。我们看看这次生成的随机数是多少呢?

(你可以看到两次的进程是不一样的,说明我真的执行了两次) 

结果你看,还是41。我们玩这个游戏,如果第一次是41,我们猜了几次猜到了,结果第二次还是41,都三次还是41,显然太没意思了吧。因此不知道你注意到没:在C语言中,rand()函数是一个标准库函数,用于生成伪随机数。伪随机,那么什么是伪随机呢?

  3.2 rand 函数的伪随机性

rand() 函数产生的随机数是伪随机的,这是因为它使用的是一个确定性的算法来生成数值序列,而不是真正的随机性。理解 rand() 函数的伪随机性需要考虑两个关键因素:种子和算法。

3.2.1 种子

种子: 伪随机数生成器需要一个初始值,称为种子,来启动其随机数生成算法。在 rand() 中,你可以使用 srand() 函数来设置种子。如果没有显式地设置种子,rand() 函数通常会使用一个默认的种子。由于伪随机数是通过算法生成的,给定相同的种子,rand() 将生成相同的数值序列。

3.2.2 算法

字面意思就是计算的方法。rand() 函数的算法是特定的伪随机数生成算法。这个算法在 C 标准中没有具体规定,因此可以因编译器和操作系统的不同而有所差异。这种算法通常是基于一些数学运算,如取余、乘法、加法等,以生成接近均匀分布的整数。

所以我们不难想到,因为我们刚开始没有给定种子,所以编译器用了相同的种子,而且确定的编译执行随机数的算法也是相同的最终导致了为什么每次生成的数是一样的。

那么我们怎么改变这种情况呢,算法无法改变吗,那么我们只要让种子是变的就行。所以接下来我们要用想办法改变种子。

3.3 srand()+time()实现理论上的随机

3.3.1 srand()函数

srand() 函数则用于设置伪随机数生成器的种子。在伪随机数生成器中,种子是一个起始值,通过该值可以确定整个伪随机数序列。如果使用相同的种子,伪随机数生成器将生成相同的数值序列。

我们来试试通过改变种子来看看效果

这样每次改变数太麻烦了,那我们怎么改种子呢,什么是每时每都在改变呢——时间。

3.3.2 time()函数

time() 函数是一个 C 标准库中的函数,用于获取当前的系统时间。它返回一个表示自协调世界时(Coordinated Universal Time,UTC)1970年1月1日零点零分零秒以来经过的秒数的整数值,也被称为时间戳。

这个函数的返回类型是time_t

我们来看看使用的效果

在这里,为什么括号里要输入NULL表示指针不指向任何有效的对象或地址。我们也可以简单理解成time()函数将结果传给了它本身。

如果想传给其他变量可以这样写

3.3.3 大功告成:srand (time(NULL))

每次执行的结果都不一样。

3.4 其他部分

完成了这个部分其他的关于根据用户的输入进行判断就是if函数了,我们直接进入代码编写环节。

4.代码编写

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	printf("********猜数游戏********\n");
	printf("程序随机生成1个1-100的整数\n");

	int code = 0;
	printf("**请按1投币开始游戏哦**\n");
	scanf("%d", &code);
	do
	{	
		if (code == 1)
		{
			printf("********游戏开始********\n");
			srand(time(NULL));
			//当前时间作为种子,每时每刻都在改变
			int unknow_num = 0;
			unknow_num = rand() % 100 + 1;
			//未知数太大了,所以对100取模,范围是0-99,再加1,刚好范围是1-100

			printf("******随机数已经生成*****\n");
			printf("********机会只有5次哦****\n");
			printf("********请开始猜*********\n");

			int user_num = 0;
			int count = 5;
			//设定机会只有5次

			while (scanf("%d", &user_num) == 1)
			{
				count--;
				if (count == 0)
				{
					printf("***少年,你没机会了****");
					break;
				}
				else
				{
					if (user_num < unknow_num)
					{
						printf("猜的太小了嘛,继续猜\n");
						printf("*****还有%d次机会***\n", count);
					}
					else if (user_num > unknow_num)
					{
						printf("猜的太大了嘛,继续猜\n");
						printf("*****还有%d次机会***\n", count);
					}
					else
					{
						printf("你好棒棒,猜对了呢\n");
						printf("正确答案是%d\n", unknow_num);
						break;
					}
				}
			}
			printf("你总共猜了%d次哦\n", 5 - count);
			printf("********游戏结束********\n");
		}
		code = 0;
		printf("如果还想继续游玩请按1投币\n");
		scanf("%d",&code);
	} while (code == 1);
	return 0;
}

运行效果

                                                                              

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值