首页 > 解决方案 > 在 C++ 中生成具有相等概率的随机数

问题描述

例如,范围对数组 p={[23, 28], [11, 14], [31, 39]}

您必须返回随机数,以便该数字应为:

  1. 在这些对中的任何一对
  2. 这些范围内的每个数字都应该具有相同的被选中概率。

我可以很容易地生成一个随机数,它位于任何这些区间之间,比如

int x=(rand()%(p[i].second-p[i].first) )+ p[i].first;

如何生成一个随机数,该随机数可以位于数组中的任何间隔中,并且概率也相等。

标签: c++random

解决方案


在 [0, 18] 范围内均匀地绘制一个数字。

添加11。

如果该数字为 15 或更多,则添加 8。

如果该数字为 29 或更多,则加 2。

这种方法的优点是它只使用一张图纸。使用多个绘图可能会导致随机数的统计属性恶化,具体取决于底层生成器的属性。带有拒绝的抽样可能会导致一些低差异序列出现问题,例如 Sobol。


推荐阅读