Взвешенная случайность: бросьте кубик от 1 до 1000, в среднем до 100 … какой std :: distribution использовать?

Я хочу бросить кубик от 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)
биномиальное распределение
(C ++ 11)
negative_binomial_distribution
(C ++ 11)
geometric_distribution
(C ++ 11)
Распределения Пуассона
распределение Пуассона
(C ++ 11)
exponential_distribution
(C ++ 11)
gamma_distribution
(C ++ 11)
weibull_distribution
(C ++ 11)
extreme_value_distribution
(C ++ 11)
Нормальные распределения
нормальное распределение
(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)

-11

Решение

Вы может быть быть в состоянии использовать биномиальное распределение если его свойства удовлетворят ваши потребности. Это дает вам контроль над максимальным значением и средним значением. Вы можете даже выбрать нецелое среднее значение, если хотите. Вы не можете выбрать минимум, так как он всегда равен нулю, поэтому вам, возможно, придется компенсировать результат:

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, будет удовлетворять ограничениям для диапазона и среднего значения. Как и функция, которая возвращает 1 в 80% случаев, 370 в 16% случаев и 1000 в 4% случаев. Поэтому я предполагаю, что у вас есть некоторые дополнительные ожидания относительно вашего дистрибутива, но вам нужно сделать их явными, чтобы получить подходящий ответ. Вышесказанное предполагает своего рода колоколообразное распределение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]