c++ - 在 C++ 中生成均匀分布的伪随机数

标签 c++ random

cplusplus.com reference据称,在尝试生成随机数时使用模运算符将使较小的数字更有可能出现:

random_var = rand() % 100 + 1; //this will generate numbers between 1-100

为什么数字越低可能性越大?如果是的话,我们为什么不使用下面的代码:

random_var = rand()/(RAND_MAX/100) + 1; //also will generate those, more uniform I guess

最佳答案

假设 RAND_MAX 是 150。(显然实际上不是。)我们想要 0-99 之间的数字。然后我们执行rand() % 100。酷。

问题是,如果 RAND() 返回一个大于 100 的数字怎么办?我们以 102 为例。102 % 100 = 22 % 100 = 2。因此,使用给定的算法,我们有 2/150 的机会得到 2。但50以上的数字呢?我们只有 1/150 的机会得到它。 RAND_MAX 越高,这个问题就越少,但它仍然是一个问题。

请注意,如果 RAND_MAX 可以被您想要“调制”它的数字整除,则所有数字的可能性都相同。即如果 RAND_MAX 是 200 而不是 150。希望这有帮助!

编辑:实际的数学。

RAND_MAX 保证至少为 32767。如果我们想要 0-99 的范围,我们可以执行 RAND() % 100。那么,0到67之间的数字都会出现328次,而68-99每个只会出现327次。前 68 个数字的概率为 1.0010071%,其余数字的概率仅为 0.9979553%。我们希望他们都是1%!通常不是主要问题,但根据用例,可能会显示一些奇怪的行为。

关于c++ - 在 C++ 中生成均匀分布的伪随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392522/

相关文章:

c++ - 运行 MFC 应用程序时有没有办法输出到 "console"?

python - 三角分布随机变量

java - 为什么此代码不生成随机代码?

generics - 是否可以从函数中返回具有随机类型的泛型结构

c++ - 从另一个线程触发 COM 事件

c++ - 无法从成员变量中的初始化字符串推断数组大小的原因是什么?

c++ - 临时对象可以绑定(bind)到非常量引用吗?

c++ - 重置 "static"类的函数的命名约定

c++ - 如何创建一个非常大的唯一整数数组?

c++ - 所有类型的矢量化随机数生成