Имитация времени ожидания Пуассона - PullRequest
7 голосов
/ 30 июня 2011

Мне нужно смоделировать время ожидания Пуассона. Я нашел много примеров моделирования количества прибытий, но мне нужно смоделировать время ожидания для одного прибытия, учитывая среднее время ожидания.

Я продолжаю находить код, подобный этому:

public int getPoisson(double lambda) 
{   
    double L = Math.exp(-lambda);   
    double p = 1.0;   
    int k = 0;   

    do 
    {    
        k++;     
        p *= rand.nextDouble(); 
        p *= Math.random(); 
    } while (p > L);   

    return k - 1; 
} 

но это количество прибытий, а не время прибытия.

Эффективность предпочтительнее точности, больше из-за энергопотребления, чем времени. Язык, на котором я работаю, - это Java, и было бы лучше, если бы алгоритм использовал только методы, доступные в классе Random, но это не обязательно.

Ответы [ 2 ]

6 голосов
/ 30 июня 2011

Время между поступлениями является экспоненциальным распределением, и вы можете сгенерировать случайную величину X~exp(lambda) по формуле:

-ln(U)/lambda` (where U~Uniform[0,1]). 

Дополнительная информация о генерации экспоненциальной переменной .

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

0 голосов
/ 09 марта 2013

Если вы хотите симулировать землетрясения, молнии или тварей, появляющихся на экране, обычный метод состоит в предположении распределения Пуассона со средней скоростью прибытия λ.

Проще всего имитировать-прибыли:

При распределении Пуассона прибытие становится более вероятным с течением времени.Это соответствует кумулятивному распределению для этой функции плотности вероятности.Ожидаемое значение распределенной по Пуассону случайной величины равно λ, равно как и ее дисперсия.Простейшим способом является выборка кумулятивного распределения, имеющего экспоненциальную форму (e) ^ - λt, которое дает t = -ln (U) / λ.Вы выбираете равномерное случайное число U и включаете формулу, чтобы получить время, которое должно пройти до следующего события.К сожалению, поскольку U обычно принадлежит [0,1 [, что может вызвать проблемы с журналом, поэтому его легче избежать с помощью t = -ln (1-U) /λ.

Пример кода может бытьнаходится по ссылке ниже.

https://stackoverflow.com/a/5615564/1650437

...