Как генерировать числа с линейно заданной вероятностью?

Здравствуйте.

Есть задача генерировать числа в заданном диапазоне. Причем вероятность появления чисел задается, она не одинакова.

Приведу пример вызова нужной функции:
random([[0, 0], [10, 50], [15, 10], [20, 40]])

5c7bc74df384a515247128.png

Тут диапазон чисел для генерации от 0 до 20. Вероятность появления 0 - 0%.
10 - 50%, 15 - 10%, 20 - 40%.

Соответственно, например, число 5 появится уже с 25% вероятностью, число 1 с 5% вероятностью и так далее. Количество пар значений на входе в функцию может быть любым, диапазон тоже любым. Генерируемые числа не обязательно должны быть целыми.

Как реализовать такую функцию? Может есть уже готовые реализации?

P.S. В комментариях справедливо подсказали, что сумма вероятностей на моем графике получится больше 100%, что невозможно. Поэтому можно считать что указаны не проценты вероятности, а единицы вероятности.
  • Вопрос задан
  • 1357 просмотров
Решения вопроса 2
@Alexander1705
Поделите фашу функцию на площадь под ней и получите плотность вероятности, возьмите интеграл плотности (не сложно для линейной функции) и получите функцию распределения.
Постройте функцию обратную функции распределения, сгенерируйте число равномерно распределённое от 0 до 1 и вычислите значение полученной функции.
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Для начала простой случай, где вероятность линейна на всём диапазоне, один сегмент.
Генератор случайных чисел даёт дробное от 0 до 1 с постоянной вероятностью.

Теперь вспомните график параболы y = x^2 Там на шаге x от 0 до 1, y растет от 0 до 1, на шаге от 3 до 4 y растёт уже от 9 до 16, на 7. Взяв равномерно-случайную величину от 0 до 16, квадратный корень из неё неравномерно попадёт на диапазон от 0 до 4. Вероятнее на диапазон 3-4, чем на 0-1. И вероятность попадания в точку x будет прямо пропорциональна x.

Это интуиция, которая, надеюсь, поможет вам понять и разработать решение для вашей задачи.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@rPman
Если параметры задают вероятность дискретно (на картинке кстати у вас не дискретно а сложные нелинейные зависимости, т.е. 1 встречается почти в 50 раз реже 10, смею предположить что вам ТАК не надо) на интервалах, типа от [0-10) - 50 то решайте проблему в лоб, сначала выбирайте интервал в соответствии с вероятностями (если задаете количественно, то это сумма заданых значений - максимальное значение, а интервал значения rand - соответствующее значение для суммы до этого интервала и с ним, после выбора интервала просто делаете повторный rand так как в пределах интервала вам нужно равномерное.
Ответ написан
@polybook
Генерируете пару случайных чисел с равномерным распределением. Предположим, первое х=10. Если второе лежит под вашим графиком, т.е. у
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы