0

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

4

1 回答 1

2

调整我在Boost 文档中找到的代码,我相信这些方面的内容应该可以解决问题:

#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;
}

严格来说,它的作用是将 70% 的概率分配给数字 1-3(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,将所有这些数字放入 astd::vector并应用std::random_shuffle()。这将保证 70:30 的要求(取决于 N 的可能舍入误差除外)。

于 2012-08-22T05:15:24.380 回答