2010-02-05 41 views
7

Conozco el algoritmo de Knuth para generar números aleatorios distribuidos de Poisson (a continuación, en Java), pero ¿cómo lo traduzco en llamar a un método, generateEvent(), al azar en el tiempo?¿Cómo puedo generar eventos aleatorios discretos con una distribución de Poisson?

int poissonRandomNumber(int lambda) { 
    double L = Math.exp(-lambda); 
    int k = 0; 
    double p = 1; 
    do { 
     k = k + 1; 
     double u = Math.random(); 
     p = p * u; 
    } while (p > L); 
    return k - 1; 
} 

Respuesta

2

Si está buscando simular el tiempo de llegada entre eventos, desea la distribución exponencial.

Tome un vistazo a Pseudorandom Number Generator - Exponential Distribution

Su código sería el siguiente aspecto:

// Note L == 1/lambda 
public double poissonRandomInterarrivalDelay(double L) { 
    return (Math.log(1.0-Math.random())/-L; 
} 

...

while (true){ 
    // Note -- lambda is 5 seconds, convert to milleseconds 
    long interval= (long)poissonRandomInterarrivalDelay(5.0*1000.0); 
    try { 
     Thread.sleep(interval); 
     fireEvent(); 
} 
+0

Hola, necesito generar números aleatorios en la tasa de intervalo de Poisson usando Java ... Intenté usar su función y método poissonRandomInterarrivalDelay siempre devuelve cero para cualquier valor de lambda. – Learner

+0

¿Puedes publicar tu código como una nueva pregunta? Tal vez pueda ver algo ... –

+0

No puedo hacerlo. Actualmente estoy bloqueado ... – Learner

0

Los números aleatorios de Poisson se está generando, mientras Scott mencionó, represente la frecuencia de sus eventos. Una vez que tenga la frecuencia, puede ajustar sus ocurrencias en el intervalo utilizando una segunda distribución, por ejemplo Uniform.

Supongamos que la cantidad de eventos generados para un intervalo de N es k. Entonces simplemente necesita generar (k + 1) números aleatorios que sumen a N.

| < ----------------------- N ------------------------- > |
--r_0 - (evento) --- r_1 -..- (event_k) - r_ (k + 1) -

Para hacerlo, simplemente genere (k + 1) números aleatorios y divida ellos por su suma, dividida por N. Los primeros k de estos números se convierten en las marcas de tiempo de tus eventos.

Cuestiones relacionadas