加权随机:掷骰子 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。所以我假设你对你的分布有一些额外的期望,但你需要明确它们以获得合适的答案。以上假设是一种钟形分布。