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次机会肯定能猜出来的。

看到这里,你是不是觉得数学很有意思?