@Filarru

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

Как сгенерировать непрерывные случайные числа с определенной(известной) вероятностью?
Какие есть алгоритмы для этого (не имею ввиду встроенные библиотеки в ЯП)?
Планируется сделать все руками.
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Во-первых, компьютеры вообще не могут в непрерывность. Так что вы получите лишь некоторое приближение: дискретную случайную величину с большим количеством возможных рациональных значений. Более того, компьютеры не умеют и в случайность, поэтому вы получите лишь псевдо-случайные числа.

Обычно, сначала реализуют дискретную случайную равномерно распределенную величину. Гуглите алгоритмы генерации псевдослучайных чисел, если вам нельзя даже какой-нибудь rand() использовать.

Далее получают равномерно распределенную случайную величину на отрезке [0,1]. Для этого генерируют случайное число от 0 до MAX_RAND и делят на MAX_RAND.

Произвольную же случайную величину можно получить, воспользовавшись свойством функции распределения: Если подставить равномерно распределенную величину в обратную функцию распределения, то получится случайная величина с заданным распределением.

Пусть x искомая случайная величина Fx(t) = P(x < t). u -равномерно распределенная случайная величина. Тогда x = Fx^(-1)(u).

Например, для экспоненциальной случайной величины Fx(t) = 1-e^(-lt). Обратная функция будет Fx^(-1)(y) = -ln(1- y)/l. Значит считаете ваше случайное число, делите на MAX_RAND, подставляете в формулу -ln(1-y)/l. Или можно упрастить и брать просто -(ln y)/l, потому что равномерная случайная величина от 0 до 1 симметрична.

Проблема тут с тем, что не для всех распределений можно получить обратную функцию в виде формулы. Для нормального распределения формулы как выше нет - надо использовать функцию erf(), или считать ее приблеженно руками через какие-нибудь ряды.
Ответ написан
Комментировать
@SunTechnik
У Вас тема вопроса и сам вопрос - разные.
Можно генерировать случайные числа с за данным законом распределения, но для непрерывных величин, вероятность конкретного значения всегда равна нулю.
Это к фразе: "Как сгенерировать непрерывные случайные числа с определенной(известной) вероятностью?"

Распределение вероятности может задаваться разными способами (аналитически, графический, одно из известных распределений). Понятно, что и алгоритмы реализаций будут отличаться.

Большинство алгоритмов сводятся к преобразование равномерного распределения к заданному.

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

Поэтому, без дополнений к вопросу, ответить на текущий - невозможно..

Всё известные алгоритмы генерации случайных чисел даже для равномерного распределения имеют кучу недостатков, поэтому большинство современных систем имеют в своём составе аппаратные реализации генераторов, основанные на физических принципах.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы