目录
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-100的数字,然后用户猜这个数字为多少。计算机给出提示,是大了还是小了,直到找到正确答案。
那么我们该如何实现呢,从前往后看,我们第一步需要让计算机生成一个随机数,然后存储下来,接着我们需要再将用户输入的数存储下来,与生成的数进行对比,并返回比较结果生成对用户的提示,以此类推,直到找到正确答案。
在C语言中,rand()
函数是一个标准库函数,用于生成伪随机数,在使用的时候我们需要使用头文件:
我们可以这样使用:
运行以后我们看到生成的数是41。好像生成随机数这个任务已经完成了,但是事实真的如此吗?
假设我们我们已经玩完一局了,我们重新执行程序再玩一局。我们看看这次生成的随机数是多少呢?
结果你看,还是41。我们玩这个游戏,如果第一次是41,我们猜了几次猜到了,结果第二次还是41,都三次还是41,显然太没意思了吧。因此不知道你注意到没:在C语言中,rand()
函数是一个标准库函数,用于生成伪随机数。伪随机,那么什么是伪随机呢?
rand()
函数产生的随机数是伪随机的,这是因为它使用的是一个确定性的算法来生成数值序列,而不是真正的随机性。理解 rand()
函数的伪随机性需要考虑两个关键因素:种子和算法。
种子: 伪随机数生成器需要一个初始值,称为种子,来启动其随机数生成算法。在 rand()
中,你可以使用 srand()
函数来设置种子。如果没有显式地设置种子,rand()
函数通常会使用一个默认的种子。由于伪随机数是通过算法生成的,给定相同的种子,rand()
将生成相同的数值序列。
字面意思就是计算的方法。rand()
函数的算法是特定的伪随机数生成算法。这个算法在 C 标准中没有具体规定,因此可以因编译器和操作系统的不同而有所差异。这种算法通常是基于一些数学运算,如取余、乘法、加法等,以生成接近均匀分布的整数。
所以我们不难想到,因为我们刚开始没有给定种子,所以编译器用了相同的种子,而且确定的编译执行随机数的算法也是相同的最终导致了为什么每次生成的数是一样的。
那么我们怎么改变这种情况呢,算法无法改变吗,那么我们只要让种子是变的就行。所以接下来我们要用想办法改变种子。
srand()
函数则用于设置伪随机数生成器的种子。在伪随机数生成器中,种子是一个起始值,通过该值可以确定整个伪随机数序列。如果使用相同的种子,伪随机数生成器将生成相同的数值序列。
我们来试试通过改变种子来看看效果
这样每次改变数太麻烦了,那我们怎么改种子呢,什么是每时每都在改变呢——时间。
time()
函数是一个 C 标准库中的函数,用于获取当前的系统时间。它返回一个表示自协调世界时(Coordinated Universal Time,UTC)1970年1月1日零点零分零秒以来经过的秒数的整数值,也被称为时间戳。
这个函数的返回类型是time_t
我们来看看使用的效果
在这里,为什么括号里要输入NULL表示指针不指向任何有效的对象或地址。我们也可以简单理解成time()函数将结果传给了它本身。
如果想传给其他变量可以这样写
每次执行的结果都不一样。
完成了这个部分其他的关于根据用户的输入进行判断就是if函数了,我们直接进入代码编写环节。
#include
#include
#include
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;
}
运行效果