【问题标题】:What is the range that the random function can return?随机函数可以返回的范围是多少?
【发布时间】:2020-02-21 18:30:05
【问题描述】:
int nextInt(int n) {
    return rand() / static_cast<double>(RAND_MAX) * n;
}

我发现有人写了上面的函数(nextInt),他说nextInt 在 [0, n - 1] 中返回一个随机整数,但我认为nextInt 在 [0, n] 中返回一个随机整数.我想知道谁是对的,为什么?

【问题讨论】:

  • STL 先生的短视频:rand() 被认为有害 - channel9.msdn.com/Events/GoingNative/2013/… 回答您的问题等等。
  • 那么结论是什么?
  • 观看或不观看 - 总结所有错误(rand)就是视频的内容。您的具体问题大约在 6 点 10 分开始。引用:“......非常不统一......”
  • 如果我在 Visual Studio 中运行它(RAND_MAX 只是 32767),我很快就会得到n
  • 其实这样的细节在文档中很容易找到。例如cppreference.com返回一个介于​0​和 RAND_MAX 之间的伪随机整数值(包括 0 和 RAND_MAX)。(强调我的。)

标签: c++ function math random floating-point


【解决方案1】:

随机函数可以返回的范围是多少?

标准将其指定为 [0, RAND_MAX](含)。

我想知道谁是对的,为什么?

你是。 nextInt 在技术上可以返回 n,但它这样做的机会很小。只有当 rand() 返回 RAND_MAX 时才会发生这种情况(在理论上,int 的范围不能用 double 精确表示的情况下,可能是其他一些接近值,根据 cmets)。

【讨论】:

  • 技术上我猜这是假设double可以完全代表RAND_MAX。对于 IEEE 64 位浮点数,情况确实如此,但该标准在很大程度上未指定浮点实现。
  • 我相信所需的检查是std::numeric_limits&lt;double&gt;::is_iec559 &amp;&amp; std::numeric_limits&lt;double&gt;::digits &gt;= std::numeric_limits&lt;int&gt;::digits
【解决方案2】:

正如link 中提到的那样: 返回一个介于​0​和 RAND_MAX 之间的伪随机整数值(包括 0 和 RAND_MAX)。所以nextInt 在 [0, n] 中返回一个随机整数。

原因:当rand() 返回值等于RAND_MAX 时: RAND_MAX / RAND_MAX * n = n

【讨论】:

    【解决方案3】:

    你是对的。

    rand()返回[0, RAND_MAX]中的值,因此该函数返回[0, n]中的值。

    nextInt 将返回一个随机数,但它不使用拉普拉斯分布来生成这些;因为n 比来自[0, n] 的其他数字更不可能出现

    这是否是一个问题取决于用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-19
      • 2012-07-14
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多