gpt4 book ai didi

c++ - 在一定范围内随机,新 rand() 版本是否存在数字偏差?

转载 作者:太空狗 更新时间:2023-10-29 23:30:21 25 4
gpt4 key购买 nike

阅读各种其他 SO 问题,当使用 rand() % N 时,您可能会碰巧修改获得的伪数的偏差,因此您通常必须引入一些范围处理。

但是在所有情况下,总是会提到 rand(),而不是较新的 random() 或 arcrandom4() 函数或 native C++11 方法。当你在一组上运行这些例程时会发生什么?你有像 rand() 这样的偏差吗?

谢谢。

最佳答案

以下答案没有Eric Lippert's blog post on the same topic 详细。 .另外,this question and its answers处理相同的主题。

大多数来自 rand() % N 的偏差不是来自 rand() 部分 - 它来自 % N部分。

让我们考虑一个“良好”的 rand() 实现,它以相等的概率生成从 0 到 100(为简单起见而选择)的所有数字 - 均匀分布。接下来假设我们要使用 rand() 的这个实现来生成 0 到 80 之间的随机数,所以我们执行 rand() % 80。让我们分解一下接下来可能发生的事情的可能性:

  1. rand() 生成一个从 0 到 79 的数字。从 0 到 79 % 80 的任何数字保持相同的数字
  2. rand() 生成一个从 80 到 100 的数字。从 80 到 100 % 80 的任何数字都会转换为 0 到 20

这意味着有两种方式可以得到 0 和 20 之间的数字,但只有一种方式可以得到 21 到 79 之间的数字。从 0 到 20 的数字比从 21 到 79 的数字更有可能。这通常不是理想的属性。

N 的任何值均分为 rand() 的最大值都不会出现此问题,因为生成任何值的方法数量相等。此外,对于较小的 N 值,偏差比 N 值更接近 rand() 的最大值时要小得多。

那么,除了 rand() 之外的函数呢? 如果它们返回某个固定范围内的值并且您执行模运算,它们将遭受相同的偏差。如果您正在调用一个以范围作为参数的随机函数,那么您不需要进行模运算。该函数可能会在内部处理任何偏差。

关于c++ - 在一定范围内随机,新 rand() 版本是否存在数字偏差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24067831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com