加权随机:掷骰子1到1000,平均到100 ...使用哪个std :: distribution?

问题描述 投票:-11回答:1

我想从1到1000掷骰子。然而,在许多试验中,我希望平均值为100。

怎么样?

int weighted_rand(int min, int max, int avg);

...

weighted_rand(1, 1000, 100);

这不是家庭作业btw。

统一分布uniform_int_distribution(C ++ 11)uniform_real_distribution(C ++ 11)generate_canonical(C ++ 11)Bernoulli发行版bernoulli_distribution(C ++ 11)binomial_distribution(C ++ 11)negative_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)lognormal_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)

c++ math random distribution weighted
1个回答
1
投票

如果它的属性满足您的需要,您可以使用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;
}

由于在没有更详细信息的情况下,正态分布通常用于连续变量,因此使用二项分布作为其离散对应物可能是一个很好的解决方案。

但这远非唯一的,根据您的使用情况,它可能会很糟糕。您需要提供更多详细信息。正如我在评论中所写的那样,总是返回100的“随机”函数将满足范围和平均值的约束。如同在80%的案例中返回1的函数一样,在16%的案例中返回370,在4%的案例中返回1000。所以我假设你对你的发行有一些额外的期望,但是你需要明确它们以获得合适的答案。以上假设是一种钟形分布。

© www.soinside.com 2019 - 2024. All rights reserved.