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