создание неравномерного целочисленного распределения с использованием tr1

Прямо сейчас я использую следующий код для создания равномерного распределения целых чисел с диапазоном. (Я вынул код раздачи)

int random(int min, int max)
{
    static std::mt19937 gen;
    std::uniform_int dist(min, max);
    return dist(gen);

}

Я пытаюсь изменить его, чтобы получить распределение, которое поддерживает twords минимальное значение и почти никогда не дает значения, близкого к максимальному. Я вижу все готовые дистрибутивы, но ни один из них не является целочисленным. Кроме того, я не могу сказать, какой из них подходит мне, основываясь на какой-либо документации. Самое близкое, что я пришел, - это распределение хи-квадрат, как показано в Википедии, где k = 2

Но я не могу понять, основываясь на документации , как использовать его с целыми числами, не говоря уже о том, чтобы установить значение k.

Как мне настроить свою функцию на использование подходящего неравномерного целочисленного распределения?


все еще работает над выбором правильного дистрибутива:

еще не совсем там, так как 0 должен быть чаще, чем 1, но это должно помочь следующему человеку, публиковать больше результатов по мере их поступления.


ну, моим окончательным решением стала комбинация методов:

int randomDist(int min, int max)
{
    static std::mt19937 gen;
    std::chi_squared_distribution dist(2);

    int x;
    do
    {
    x = (int)(max*dist(gen)/10) + min;
    }
    while (x > max);
    return x;
}

что дает результат:

8
задан Zak 14 March 2011 в 23:53
поделиться