dmckee на самом деле правильно, но я подумал, что я уточню подробнее и попытаюсь объяснить здесь некоторые недоразумения.Я определенно мог потерпеть неудачу.f_s(l)
, функция, которую вы используете в своей красивой формуле выше, является функцией распределения вероятностей.Сообщается, что для заданного значения l
между 0 и n вероятность того, что l
- это длина сегмента.Сумма (интеграл) для всех значений от 0 до n должна быть равна 1.
График в верхней части страницы 7 смущает эту точку.Он показывает l
против f_s(l)
, но вы должны остерегаться случайных факторов, которые он накладывает на сторону.Вы заметили, что значения внизу изменяются от 0 до 1, но есть коэффициент x n
на стороне, что означает, что значения l
на самом деле переходят от 0 к n.Кроме того, на оси Y есть x 1/n
, что означает, что эти значения на самом деле не доходят примерно до 3, они переходят к 3 / n.
Так что вы делаете сейчас?Что ж, вам нужно решить для кумулятивной функции распределения, интегрируя функцию распределения вероятностей по l
, что на самом деле оказывается не так уж плохо (я сделал это с помощью онлайн-интегратора Wolfram Mathematica, используя x для l
и используя толькоуравнение для у <= .5).Это, однако, использовало неопределенный интеграл, и вы действительно интегрируете по x от 0 до <code>l.Если мы установим результирующее уравнение равным некоторой переменной (например, z), цель теперь состоит в том, чтобы решить для l
как функцию от z.z здесь - случайное число от 0 до 1. Вы можете попробовать использовать символический решатель для этой части, если хотите (я хотел бы).Тогда вы не только достигли своей цели, выбирая случайные l
с из этого распределения, вы также достигли нирваны.
Еще немного проделанной работы
Я помогу немного больше.Я попытался сделать то, о чем говорил, для y <= .5, но система символической алгебры, которую я использовал, не смогла сделать инверсию (какая-то другая система могла бы это сделать).Однако тогда я решил попробовать использовать уравнение для .5 <y <= 1. Это оказалось намного проще.Если я изменяю <code>l на x в f_s(l)
, я получаю
y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))
Интегрируя это по x от 0 до l
Я получил (используя онлайн-интегратор Mathematica):
(l / n)^(y / (1 - y))
Это не становится намного лучше, чем с такими вещами.Если я установлю это равным z и решу для l
, я получу:
l = n * z^(1 / y - 1) for .5 < y <= 1
Одна быстрая проверка для y = 1. В этом случае мы получим l = n
независимо от того, что z.Все идет нормально.Теперь вы просто генерируете z (случайное число от 0 до 1) и получаете l
, которое распределяется так, как вам нужно для .5 l -> n-l
и y
-> 1-y
и получим
n - l = n * z^(1 / (1 - y) - 1)
l = n * (1 - z^(1 / (1 - y) - 1)) for 0 < y <= .5
В любом случае, это должно решить вашу проблему, если я где-то не ошибся.Удачи.