【问题标题】:How the rand() choose a number? [duplicate]rand() 如何选择一个数字? [复制]
【发布时间】:2011-07-26 22:53:22
【问题描述】:

可能重复:
How does rand() work? Does it have certain tendencies? Is there something better to use?

我不确定任何编程语言中的 rand() 函数或类似函数何时返回一个完全“合乎逻辑”的值。因为它们不是基于时间、小时、天或其他我想知道他如何选择数字。有人能回答我吗?

谢谢,布鲁诺·阿拉诺。

【问题讨论】:

  • 通常它使用线性同余 PRNG,这意味着有一个状态数 s(您可以将其作为初始值),并且在每一轮您计算一些固定常数的 s = m * s + b mc。如果你很好地选择了常数,那么得到的数字看起来很“随机”。当然还有很多其他算法,但是这个特别简单易行。

标签: compiler-construction programming-languages


【解决方案1】:

这取决于算法。维基百科总结了一种计算创建“随机数”的方法 http://en.wikipedia.org/wiki/Random_number_generation

m_w = <choose-initializer>;    /* must not be zero */
m_z = <choose-initializer>;    /* must not be zero */

uint get_random()
{
   m_z = 36969 * (m_z & 65535) + (m_z >> 16);
   m_w = 18000 * (m_w & 65535) + (m_w >> 16);
   return (m_z << 16) + m_w;  /* 32-bit result */
}

您现在可以购买能够产生更好随机数的硬件随机数生成器

【讨论】:

    【解决方案2】:

    实际上,rand 的大多数实现都以某种方式基于时间。通常,在创建随机数时,您可以传入种子。相同的种子将产生相同的随机数字串。如果没有传入种子,大多数实现会根据当前系统时间创建一个种子。

    【讨论】:

      【解决方案3】:

      这取决于您要链接的库的实现。 POSIX.1-2001 给出了 rand() 和 srand() 实现的以下示例,当需要在两台不同的机器上使用相同的序列时可能很有用。

      static unsigned long next = 1;
      /* RAND_MAX assumed to be 32767 */
      int rand(void) {
          next = next * 1103515245 + 12345;
          return((unsigned)(next/65536) % 32768);
      }
      void srand(unsigned seed) {
           next = seed;
      }
      

      【讨论】:

        【解决方案4】:

        这取决于算法的实现。然而,实现必须是确定性,例如 LCG 算法。

        这种确定性算法的周期取决于为公式选择的值,种子本身通常是时间戳+常量。您可以在此维基百科页面中找到某些语言的 LCG 实现:

        LCG Algorithm

        非确定性数字生成器,例如 Java 中的 SecureRandom,使用与硬件相结合的算法尝试生成真正的随机数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-14
          • 1970-01-01
          • 2018-02-10
          • 2014-10-24
          • 2014-09-22
          • 1970-01-01
          相关资源
          最近更新 更多