返回介绍

4.5.4 随机数函数

发布于 2025-04-11 22:32:56 字数 2024 浏览 0 评论 0 收藏 0

在很多程序中需要用到随机数,通过包含“stdlib.h”头文件,就可以使用库函数来产生随机数了。

例 4-2 】编写程序,在控制台窗口上打印 1~10 的 5 个随机数。

1.rand

我们可以通过库函数 rand 来获得一个 0~32768 的随机数,但程序要求的随机数是 1~10 之间。怎么办呢?

可以利用下面的公式来得到指定区间的随机数:

rand() % (max - min + 1) + min

其中 max 表示区间的最大值,min 表示区间的最小值。例如想要得到一个 1~10 之间的随机值,max 就是 10,而 min 就是 1。将其代入公式后变为:

rand() % (10 - 1 + 1) + 1

再简化一下,变为:

rand() % 10 + 1

任何值对 10 进行求模后,得到的值肯定为 0~9,将这个值加上 1 后,区间自然就变成 1~10 了。

下面就可以完成这个程序了,代码如下:

代码中,首先包含了随机数函数需要用到的头文件“stdlib.h”,在主函数中使用了一个 for 循环语句,它会让循环体被执行 5 次,每次都会使用“rand() % 10 + 1”得到一个介于 1~10 之间的随机数,然后通过 printf 函数打印到窗口上。程序的运行结果如下:

2 8 5 1 10

读者在测试时,可能会发现一个问题:每次运行这个程序后,打印输出的结果是完全相同的,也就是程序的运行结果全是“2 8 5 1 10”。那这还算是真正的随机数吗?哈哈,我们通常将这样的随机数称为“伪随机数”,那如何获得真的随机数呢?

2.srand

在通过 rand 函数获取随机数时,它需要用到一个被称之为“种子”的初始值,根据不同的种子,才能获得不同的随机数,通常情况下种子的默认值为 1。

库函数 srand 就是用来设置这个种子的,例如:

srand(100);

这条语句的作用是通过 srand 函数将种子的值设为 100。如果我们把这条语句放在 for 循环语句之前:

srand(100);
for(int i = 0; i < 5; ++i)
    printf("%d ", rand() % 10 + 1);

现在重新编译运行这个程序,结果会变成:

6 7 6 5 5

打印的结果和之前不一样了。但是……

后面再运行这个程序,会发现结果又都变成“6 7 6 5 5”了。这时有人可能会说,再使用 srand 函数改一下种子就行了。是的,但这是“笨方法”,因为每次修改种子后,都需要重新编译这个程序,非常麻烦。那有没有一劳永逸的解决办法呢?

通过思考,发现解决问题的关键是种子值。如果种子值是固定的,那得到的随机数就会相同。如果种子值是不断变化的,那得到的随机数是不是就不一样啦?非常正确。现在的问题,就在于用什么办法,能让种子值不断变化呢?

之前介绍的 time 函数可以返回从 1970 年到现在所经过的时间秒数。程序是在不同的时间运行的,那这个时间秒数肯定是不断变化的,若将这个时间秒数作为种子,是不是就能完美解决问题啦?按照这个思路,将代码修改如下:

现在每次运行程序后,就能在控制台窗口打印各不相同的随机数啦。若两次程序的运行时间间隔小于 1 秒,还是可能会发生随机结果相同的情况。为什么会这样,相信此时的你已经能够知晓。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。