我想生成1-10范围内的随机数。要求70%的数字应该在1-3的范围内生成,其余的30%在4-10的范围内生成。我正在使用boost来生成概率分布。我应该使用什么探测dist以及什么参数?
发布于 2012-08-22 13:15:24
调整我在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;
}
严格地说,它所做的是将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个随机数,您可以从dist1
中提取N*0.7
时间,从dist2
中提取N*0.3
时间,将所有这些数字放入一个std::vector
中并应用std::random_shuffle()
。这将保证70:30的要求(除了可能的舍入误差取决于N)。
https://stackoverflow.com/questions/12066565
复制相似问题