生成具有预定义的非均匀概率的范围内的随机数

时间:2012-08-22 05:03:52

标签: c++ boost probability

我想生成1-10范围内的随机数。 要求是在1-3的范围内产生70%的数字,在4-10的范围内产生剩余的30%。 我正在使用boost来生成概率分布。我应该使用什么概率和什么参数?

1 个答案:

答案 0 :(得分:2)

调整我在Boost documentation中找到的代码,我相信这些内容可以解决问题:

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/discrete_distribution.hpp>

int main() {
  double probabilities[] = {
      0.7/3, 0.7/3, 0.7/3, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7, 0.3/7
  };
  boost::random::discrete_distribution<> dist(probabilities);

  /* For each number to generate: */
  int number = dist(gen) + 1; // to get range 1-10 rather than 0-9

  return 0;
}

严格来说,这样做的是它为数字1-3分配了70%的概率(70%的概率质量在1,2和3之间平均分配),30%到4-10(再次,平均分配给他们)。这并不能保证70%的数字是1-3,30%是4-10。它只是意味着随着它的增长,输出可能会收敛到该分布。

如果你想真正保证70%的数字是1-3而30%是4-6,你必须定义两个统一的分布:

boost::random::uniform_int_distribution<> dist1(1, 3);
boost::random::uniform_int_distribution<> dist2(4, 10);

然后,要生成N个随机数,您可以从N*0.7抽取dist1次,从N*0.3抽取dist2次,将所有这些数字放入std::vector 1}}并申请std::random_shuffle()。这将保证70:30的要求(除了可能的舍入误差取决于N)。