Страницы

Поиск по вопросам

среда, 16 января 2019 г.

Генерация случайного числа, с неравномерным распределнием

Как можно получить случайное число в диапазоне [0, 100], так чтобы значения в основном получались рядом с центром диапазона?
То есть значения из диапазона [40, 60] должны получаться чаще чем остальные.
Равномерно распределённое число в этом диапазоне получаю так:
Math.random() * 100


Ответ

Наиболее простой способ — сгенерировать два числа в диапазоне [0, 50] и сложить их
Это даст распределение чисел с максимальной вероятностью получить число в центре, и постепенным уменьшением вероятности от центра к краям.
Увеличивая число случайных чисел и уменьшая диапазон их генерации (соответственно с двух случайных чисел и диапазона [0, 50] до n случайных чисел и диапазона [0, 100/n]) можно ещё больше увеличить вероятность получения чисел рядом с центром по сравнению с числами возле края:
// случайное число в диапазоне [0, maximum] // чем больше numberRandoms, тем с большей вероятностью получаются числа ближе к центру (числу maximum/2) function weightedRandom(maximum, numberRandoms) { let result = 0; for (let i = 0; i < numberRandoms; ++i) result += Math.random() * (maximum / numberRandoms); return result; } console.log(weightedRandom(100, 2));
График распределения получившихся чисел для разных n

Общий случай
Имеется генератор равномерно распределённых случайных чисел на отрезке [0, 1] Хочется получить генератор случайных чисел из некоторого распределения
Предполагаем, что распределение задано с помощью функции распределения
Тогда можно воспользоваться функцией квантилей, которая является обратной к функции распределения. А именно надо сгенерировать случайное число на отрезке [0, 1] и применить к нему функцию квантилей, получится случайное число, соответствующее имеющейся функции распределения.
Хотя код получается очень простым, генерация некоторых распространённых распределений (например, нормального) таким способом не является простой, из-за сложности нахождения функции квантилей.

Комментариев нет:

Отправить комментарий