Прямо сейчас я использую следующий код для создания равномерного распределения целых чисел с диапазоном. (Я вынул код посева)
int random(int min, int max)
{
static std::mt19937 gen;
std::uniform_int<int> dist(min, max);
return dist(gen);
}
Я пытаюсь изменить его, чтобы получить распределение, которое предпочитает минимальное значение и почти никогда не дает значения, близкое к максимальному. Я вижу все готовые дистрибутивы, но ни один из них не является целым числом. А также я не могу сказать, какой из них соответствует моим потребностям, основываясь на любой документации. Самое близкое, что я получил, - это распределение хи-квадрат, как показано в Википедии, где k = 2
![image](https://i.stack.imgur.com/7KDjK.png)
Но я не могу понять, основываясь на документации , как использовать ее с целыми числами, не говоря уже о том, чтобы установить значение k.
Как я могу настроить свою функцию на использование соответствующего неравномерного целочисленного распределения?
все еще работает над выбором правильного дистрибутива: вот результаты std::poisson_distribution<int> dist((max - min) * .1);
от 0 до 20:
![image](https://i.stack.imgur.com/sOnFM.png)
пока не совсем, так как 0 должно быть чаще, чем 1, но это должно помочь следующему человеку опубликовать больше результатов по мере их поступления.
хорошо, мое окончательное решение стало комбинацией методов:
int randomDist(int min, int max)
{
static std::mt19937 gen;
std::chi_squared_distribution<double> dist(2);
int x;
do
{
x = (int)(max*dist(gen)/10) + min;
}
while (x > max);
return x;
}
дает результат:
![image](https://i.stack.imgur.com/GiGiQ.png)