【问题标题】:why is srand required to be called before generating a random number using rand为什么在使用 rand 生成随机数之前需要调用 srand
【发布时间】:2015-02-04 20:39:16
【问题描述】:

需要在srand(time(NULL)); 的行上调用srand 来为rand() 设置种子以生成随机数。 我的问题是种子需要什么?

【问题讨论】:

  • 我的问题是种子需要什么?每次运行应用程序时的随机数。
  • 我觉得需要...需要... 种子! *
  • @MarkRansom 和 我觉得需要...需要...为 s(p)eed !!
  • 你知道what a seed is吗?我怀疑如果你知道什么,你就会知道需要

标签: c++ c


【解决方案1】:

rand() 函数是一个伪随机数生成器,即,

rand() 函数返回 0 到 RAND_MAX 范围内的伪随机整数

伪随机数的产生取决于种子。如果您不提供与 seed 不同的值,您将在应用程序的每次调用中获得 same 随机数。这就是为什么srand() 用于随机化种子本身。

最常见的做法:srand(time(NULL)) [适用于单次运行评估]。

[explicit] 种子需要什么?

值得一提,来自man page

如果没有提供种子值,则 rand() 函数会自动为种子值 1。

【讨论】:

    【解决方案2】:

    我猜你的问题是为什么它没有自动播种一个不可预测的值(比如当前时间)。

    让随机数生成器在每次程序启动时都生成相同的序列可以方便调试。

    【讨论】:

    • 先生,如果我错了,请纠正我,但它不是像 is 实际上用值 1 [没有明确的种子] 自动播种的。
    • 确实如此 - 它使用已知常数 (1) 播种。
    【解决方案3】:

    随机数生成是迭代过程的结果。每次调用 rand 时都会发生以下情况:

    seed := create_new_seed(seed);
    return random_number_from_seed(seed);
    

    (注意create_new_seedrandom_number_from_seed 是纯函数,它们只使用它们的参数,不访问任何全局变量)。

    这意味着如果种子始终为 0,则rand 调用返回的一系列值将始终相同。为了允许不同的值,每次运行都使用不同的种子。运行之间会发生变化且易于使用的一件事是程序的开始时间。

    【讨论】:

      【解决方案4】:

      如果不添加 srand(),每次运行程序时,rand 都会生成相同的随机数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        相关资源
        最近更新 更多