嵌入式Linux系统编程 — 5.4 rand、srand 函数产生随机数

目录

1 随机数与伪随机数

2 rand和srand函数

3 示例程序


1 随机数与伪随机数

随机数在编程有广泛的应用场景,以下是一些常见的例子:

  • 游戏开发:在电子游戏中,随机数用来决定各种事件的结果,如怪物的出现位置、敌人的行为模式、游戏内物品的掉落概率等。
  • 模拟和建模:在科学研究和工程设计中,随机数用于模拟现实世界中的不确定性,如在蒙特卡洛模拟中计算复杂系统的行为。
  • 彩票和抽奖:在彩票和各种抽奖活动中,随机数用来决定中奖号码或奖品的分配。

随机数:是通过不可预测的物理过程产生的数值,它们具有真正的不确定性,使得每个数值在生成前都无法确定。

伪随机数:则是由算法生成的数值序列,它们看起来随机,但实际上是从一个确定的种子开始,通过数学公式计算得出。然而,伪随机数不应在需要严格安全性的场景下使用,因为它们可能被恶意用户预测和利用。

2 rand和srand函数

rand() 函数是 <stdlib.h> 头文件中定义的一个标准库函数,用于生成随机数。它返回一个伪随机数,这个数是一个在0到RAND_MAX(其值通常在32767左右)之间的整数。函数原型如下:

#include <stdlib.h>

int rand(void);

单独使用rand() 函数存在一个问题,就是每一次运行程序所得到的随机数序列都是相同的,那如何使得每一次启动应用程序所得到的随机数序列是不一样的呢?那就通过设置不同的随机数种子,可通过 srand()设置随机数种子。

使用 srand()函数为 rand()设置随机数种子,这个种子值是随机数生成算法的初始值,它决定了随后 rand() 函数生成的随机数序列。其函数原型如下所示:

#include <stdlib.h>

void srand(unsigned int seed);
  • seed: 指定一个随机数中, int 类型的数据,一般尝尝将当前时间作为随机数种子赋值给参数 seed,譬如 time(NULL),因为每次启动应用程序时间上是一样的,所以就能够使得程序中设置的随机数种子在每次启动程序时是不一样的。

3 示例程序

下面的示例程序演示了随机数生成器 rand() 函数和 srand() 函数如何影响生成的随机数序列。

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

int main() 
{
    // 生成并打印随机数
    int random_number1 = rand();
    printf("没有设置随机数种子1: %d\n", random_number1);

    int random_number2 = rand();
    printf("没有设置随机数种子2: %d\n", random_number2);

    // 使用当前时间作为种子
    srand(500);
    int random_number3 = rand();
    printf("设置随机数种子1: %d\n", random_number3);

    srand(time(NULL));
    int random_number4 = rand();
    printf("设置随机数种子2: %d\n", random_number4);

    return 0;
}

 两次运行程序,对比结果如下:

  • 没有设置种子时,random_number1 和 random_number2 的值是随机的,但可能在每次运行时都相同,这取决于程序启动时的系统状态。
  • 设置种子为500后,random_number3 将始终是相同的,因为种子值是固定的。
  • 使用当前时间作为种子后,random_number4 应该是随机的,因为每次程序运行时的时间都不同。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几度春风里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值