Как можно получить случайное число в диапазоне [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] и применить к нему функцию квантилей, получится случайное число, соответствующее имеющейся функции распределения.
Хотя код получается очень простым, генерация некоторых распространённых распределений (например, нормального) таким способом не является простой, из-за сложности нахождения функции квантилей.
Комментариев нет:
Отправить комментарий