Генерация случайной величины в режиме реального времени без состояния - PullRequest
1 голос
/ 14 февраля 2011

Мне нужна функция, которая принимает в качестве входных данных количество секунд, прошедших с момента последнего вызова, и возвращает значение true или false, если событие должно было произойти в этот период времени. Я хочу, чтобы оно срабатывало в среднем один раз за X пройденное время, скажем, 5 секунд. Мне также интересно, можно ли обойтись без какого-либо состояния, которое использовал ответ от на этот вопрос .

Я полагаю, что для полной точности нужно будет вернуть целое число для числа событий, которые должны были произойти, в случае, если он вызывается один раз каждые 10 * X раз или что-то в этом роде, так что бонусные очки за это !

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Звучит так, как будто вы описываете пуассоновский процесс , со средним числом событий в данном интервале времени, заданным пуассоновским распределением с параметром lambda = 1 / X .

Способ использования выражения на последней странице заключается в следующем для заданного значения лямбды и значения параметра t:

  1. Рассчитать случайное число от нуля до единицы; назовите это p
  2. Рассчитать Pr (k = 0) (то есть exp(-lambda*t) * (lambda*t)**0 / factorial(0))
  3. Если это число больше p , то количество смоделированных событий равно 0. END
  4. В противном случае вычислите Pr (k = 1) и добавьте его к Pr (k = 0) .
  5. Если это число больше p , то ответ равен 1. END
  6. ... и т. Д.

Обратите внимание, что да, это может закончиться более чем одним событием за период времени, если t велико по сравнению с 1 / лямбда (то есть X). Если t всегда будет маленьким по сравнению с 1 / лямбда, то вы вряд ли получите более одного события за период, и поэтому алгоритм значительно упрощается (если p

Примечание 2: нет никакой гарантии, что вы получите хотя бы одно событие за интервал X. Просто оно будет усреднено до этого значения.

(вышеизложенное не совсем понятно; тщательно проверяйте реализацию)

0 голосов
/ 14 февраля 2011

Предположим, что какой-то тип события происходит в среднем один раз в 10 секунд, и вы хотите напечатать имитированный список временных меток, на которых произошли события.

Хороший метод - генерировать случайное целое число в диапазоне[0,9] каждую 1 секунду.Если это 0 - запустить событие на эту секунду.Конечно, вы можете управлять разрешением: вы можете генерировать случайное целое число в диапазоне [0,99] каждые 0,1 секунды, а если оно приходит 0 - запускать событие для этой DeciSecond.

Предполагая, что нет зависимостимежду событиями нет необходимости сохранять состояние.

Чтобы узнать, сколько раз событие происходит в заданном временном интервале - просто сгенерируйте достаточно случайных целых чисел - в соответствии с требуемым разрешением.

Редактировать

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

...