加权随机:掷骰子 1 到 1000,平均到 100...使用哪个 std::distribution?
Weighted random: roll dice 1 to 1000, averages to 100... which std::distribution to use?
我想掷一个从 1 到 1000 的骰子。但是,经过多次试验,我希望平均值为 100。
怎么办?
int weighted_rand(int min, int max, int avg);
...
weighted_rand(1, 1000, 100);
顺便说一句,这不是家庭作业。
均匀分布
uniform_int_distribution
(C++11)
uniform_real_distribution
(C++11)
generate_canonical
(C++11)
伯努利分布
bernoulli_distribution
(C++11)
binomial_distribution
(C++11)
否定_binomial_distribution
(C++11)
geometric_distribution
(C++11)
泊松分布
poisson_distribution
(C++11)
exponential_distribution
(C++11)
gamma_distribution
(C++11)
weibull_distribution
(C++11)
extreme_value_distribution
(C++11)
正态分布
normal_distribution
(C++11)
日志normal_distribution
(C++11)
chi_squared_distribution
(C++11)
cauchy_distribution
(C++11)
fisher_f_distribution
(C++11)
student_t_distribution
(C++11)
抽样分布
discrete_distribution
(C++11)
piecewise_constant_distribution
(C++11)
piecewise_linear_distribution
(C++11)
您可能能够使用 binomial distribution 如果它的属性满足您的需要。它使您可以控制最大值和平均值。如果愿意,您甚至可以选择非整数均值。您不能选择最小值,因为它始终为零,因此您可能必须抵消结果:
int weighted_rand(int min, int max, double avg) {
std::binomial_distribution distribution{
max - min, // number of trials
(avg - min) / (max - min) // success probability of each trial
};
return distribution(prng) + min;
}
由于在缺乏更详细信息的情况下常将正态分布用于连续变量,因此使用二项式分布作为离散变量可能是一个很好的解决方案。
但这远不是唯一的,并且根据您的用例,它可能会很糟糕。您需要提供更多详细信息。正如我在评论中所写,始终 returns 100 的“随机”函数将满足范围和平均值的约束。在 80% 的情况下 returns 1,在 16% 的情况下是 370,在 4% 的情况下是 1000。所以我假设你对你的分布有一些额外的期望,但你需要明确它们以获得合适的答案。以上假设是一种钟形分布。
我想掷一个从 1 到 1000 的骰子。但是,经过多次试验,我希望平均值为 100。
怎么办?
int weighted_rand(int min, int max, int avg);
...
weighted_rand(1, 1000, 100);
顺便说一句,这不是家庭作业。
均匀分布 uniform_int_distribution (C++11) uniform_real_distribution (C++11) generate_canonical (C++11) 伯努利分布 bernoulli_distribution (C++11) binomial_distribution (C++11) 否定_binomial_distribution (C++11) geometric_distribution (C++11) 泊松分布 poisson_distribution (C++11) exponential_distribution (C++11) gamma_distribution (C++11) weibull_distribution (C++11) extreme_value_distribution (C++11) 正态分布 normal_distribution (C++11) 日志normal_distribution (C++11) chi_squared_distribution (C++11) cauchy_distribution (C++11) fisher_f_distribution (C++11) student_t_distribution (C++11) 抽样分布 discrete_distribution (C++11) piecewise_constant_distribution (C++11) piecewise_linear_distribution (C++11)
您可能能够使用 binomial distribution 如果它的属性满足您的需要。它使您可以控制最大值和平均值。如果愿意,您甚至可以选择非整数均值。您不能选择最小值,因为它始终为零,因此您可能必须抵消结果:
int weighted_rand(int min, int max, double avg) {
std::binomial_distribution distribution{
max - min, // number of trials
(avg - min) / (max - min) // success probability of each trial
};
return distribution(prng) + min;
}
由于在缺乏更详细信息的情况下常将正态分布用于连续变量,因此使用二项式分布作为离散变量可能是一个很好的解决方案。
但这远不是唯一的,并且根据您的用例,它可能会很糟糕。您需要提供更多详细信息。正如我在评论中所写,始终 returns 100 的“随机”函数将满足范围和平均值的约束。在 80% 的情况下 returns 1,在 16% 的情况下是 370,在 4% 的情况下是 1000。所以我假设你对你的分布有一些额外的期望,但你需要明确它们以获得合适的答案。以上假设是一种钟形分布。