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