En situaciones como estas, no necesita invocar el generador de números aleatorios más de una vez. u necesidad es una tabla de probabilidades acumuladas:
double c[k] = // the probability that X <= k (k = 0,...)
luego generar un número aleatorio 0 <= r < 1
, y tomar el primer número entero tal que X
c[X] > r
. Puede encontrar este X
con una búsqueda binaria.
Para generar esta tabla, necesitamos las probabilidades individuales
p[k] = lambda^k/(k! e^lambda) // // the probability that X = k
Si lambda
es grande, esto se convierte en muy impreciso, ya que ha encontrado. Pero podemos usar un truco aquí: comenzar en (o cerca) el valor más grande, con k = floor[lambda]
, y pretender por el momento que p[k]
es igual a 1
. Luego calcular p[i]
para i > k
usando la relación de recurrencia
p[i+1] = (p[i]*lambda)/(i+1)
y para i < k
usando
p[i-1] = (p[i]*i)/lambda
Esto asegura que las mayores probabilidades tienen la mayor precisión posible.
Ahora acaba de calcular utilizando c[i]
c[i+1] = c[i] + p[i+1]
, hasta el punto de que c[i+1]
es lo mismo que c[i]
. Entonces puede normalizar la matriz dividiendo por este valor límite c[i]
; o puede dejar la matriz tal como está, y usar un número aleatorio 0 <= r < c[i]
.
Ver: http://en.wikipedia.org/wiki/Inverse_transform_sampling
IIRC, una variable de Poisson tiene una distribución exponencial. Por lo tanto, este es un duplicado preciso de http://stackoverflow.com/questions/2106503/pseudorandom-number-generator-exponential-distribution. Pero incluso si estoy equivocado, el método dado allí debería funcionar. – MSalters
@MSalters: la distribución de Poisson es discreta, solo requiere valores enteros. La distribución exponencial es continua. Entonces no son lo mismo (aunque están relacionados). – TonyK
Derecha, de Wikipedia: "Si el número de llegadas en un intervalo de tiempo dado [0, t] sigue la distribución de Poisson, con mean = λt, entonces las longitudes de los tiempos entre llegadas siguen la distribución exponencial, con una media de 1/λ. ". Esa es una transformación efectiva entre los dos, estructuralmente similar al algoritmo que propuse a continuación. – MSalters