Я хочу бросить кубик от 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)
Вы может быть быть в состоянии использовать биномиальное распределение если его свойства удовлетворят ваши потребности. Это дает вам контроль над максимальным значением и средним значением. Вы можете даже выбрать нецелое среднее значение, если хотите. Вы не можете выбрать минимум, так как он всегда равен нулю, поэтому вам, возможно, придется компенсировать результат:
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% случаев. Поэтому я предполагаю, что у вас есть некоторые дополнительные ожидания относительно вашего дистрибутива, но вам нужно сделать их явными, чтобы получить подходящий ответ. Вышесказанное предполагает своего рода колоколообразное распределение.
Других решений пока нет …