C语言入门:利用随机数函数,做一个真正的猜数游戏
C作为系统级编程语言的代表,提供了丰富的系统函数来处理各种常见任务。掌握这些函数不仅能提高编程效率,还能写出更健壮、高效的代码。
今天介绍几个系统函数:随机数函数rand( )、srand( ),以及时间函数time( ),学会这些使用这些函数,让我们来写一个真正的猜数游戏。
rand( )和srand( )都是系统函数,它们的功能是随机生成数字,经常出现在一些游戏或者需要自动生成数字的程序中。
1、猜数游戏
我们曾介绍过一个猜数游戏,程序1:
程序给出的数字是38,每个人有10次机会猜数。
运行结果如下:
如果某次猜到了答案是38,那么以后再玩这个游戏就没有挑战了。
这里,把38改成一个随机数,每次玩这个游戏答案都是不一样的。
2、随机数函数rand( )
使用方法:rand( );
比如我要生成一个0-100范围内的随机数,可以这么写:
rand() % 100 + 1; // 生成1-100的随机数
因为任何数除以100的余数肯定是在0-99之间,再加上1就是0-100之间了。
程序2:
可以看到程序第2行多了一个头文件:
#include <stdlib.h>
这是因为rand( )这个系统函数是在头文件stdlib里面定义的,不加这个头文件,就不知道rand( )是啥玩意。
程序2运行结果:
这个出现的随机数是42。
但是,每次运行程序2,出现的都是42,也就是说rand( )是个伪随机数,它每次出现的数字都是一样的。
那么怎样让rand( )得到的随机数是真正的随机数呢?这就需要一个随机数的种子。
随机数的种子不一样,然后再使用rand( ),那么这时出现的随机数就不一样了。
3、随机数的种子函数srand( )
使用方法:srand(参数);
如:srand(10);
srand(200);
srand( )函数里的参数不一样,则rand( )出现的随机数就不一样。
程序3:
程序3运行结果:
我们看到,a和c的值是一样的,为什么呢?
因为a和c的随机数rand()的随机数种子都是一样的,都是srand(10)。
那么我想要一个时时刻刻都不一样的随机数,怎么办呢?
我们想一下什么东西是时时刻刻都不同的?
时间。
时间每时每刻都在变化,所以如果我们用时间来做随机数的种子,则每次rand( )得到的随机数就是不一样的,这才是真正的随机数。
4、时间函数time( )
time() 函数是C语言标准库中用于获取当前日历时间的函数,定义在 <time.h> 头文件中, 它返回自1970年1月1日00:00:00 UTC(Unix纪元)以来经过的秒数。
所以如果程序用到了time()函数,则需要引入头文件:
#include <time.h>
程序4:
程序4运行结果:
一般time函数用来计算程序运行时间。
程序5:
程序5运行结果:
现在我们用时间函数来做随机数的种子,那么就可以写出一个真正的猜数游戏了。
5、完善的猜数游戏
我们有了时间函数,有了随机数函数,就可以把程序1的猜数游戏改成真正的猜数游戏了。
程序6:
以下是程序的txt形式,可以直接复制运行:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL)); // 用当前时间初始化随机数种子
int answer = rand() % 100 + 1; // 生成1-100的随机数
int guess, i = 0;
printf("猜数字游戏开始!(1-100)\n");
printf("你共有%d次机会!\n\n",10);
for(i=1;i<=10;i++)
{
printf("请输入你的猜测: ");
scanf("%d", &guess);
if (guess > answer) {
printf("太大了!\n");
printf("你还有%d次机会猜大小。\n\n",10-i);
} else if (guess < answer) {
printf("太小了!\n");
printf("你还有%d次机会猜大小。\n\n",10-i);
} else {
printf("恭喜!你用了%d次猜对了!\n",i);
break;
}
}
return 0;
}
程序6运行结果:
其实如果已知要猜的数字范围在0-100之间,那么第一个数就从50猜起,如果大了那么第二个数就猜25,如果小了第二个数就猜75,这就是有名的二分查找法,10次机会肯定能猜出来的。
看到这里,你是不是觉得数学很有意思?