Necesito generar números aleatorios a partir de la distribución Binomial (n, p).C#: Algoritmo numérico para generar números a partir de la distribución Binomial
Una variable aleatoria binomial (n, p) es la suma de n variables uniformes que toman 1 con probabilidad p. En el pseudo código, x=0; for(i=0; i<n; ++i) x+=(rand()<p?1:0);
generará una Binomial (n, p).
Necesito generar esto tanto para n grande como para pequeño, por ejemplo n = 10^6 yp = 0.02. ¿Hay algún algoritmo numérico rápido para generarlo?
EDITAR -
En este momento esto es lo que tengo como aproximación (junto con las funciones para la distribución exacta de Poisson y Normal) -
public long Binomial(long n, double p) {
// As of now it is an approximation
if (n < 1000) {
long result = 0;
for (int i=0; i<n; ++i)
if (random.NextDouble() < p) result++;
return result;
}
if (n * p < 10) return Poisson(n * p);
else if (n * (1 - p) < 10) return n - Poisson(n * p);
else {
long v = (long)(0.5 + nextNormal(n * p, Math.Sqrt(n * p * (1 - p))));
if (v < 0) v = 0;
else if (v > n) v = n;
return v;
}
}
¿Funciona bien la distribución de Poisson para 'n * p <10' o para' n * (1 - p) <10'? ¿Cómo es que eliges esa distribución? – HelloGoodbye
Sí, para n grande. Binomial (n, lambda/n) converge a Poisson (lambda), ya que n va al infinito. – KalEl