Devo generare numeri casuali dalla distribuzione binomiale (n, p).C#: algoritmo numerico per generare numeri dalla distribuzione binomiale
Una variabile casuale binomiale (n, p) è la somma di n variabili uniformi che prendono 1 con probabilità p. In pseudo codice, x=0; for(i=0; i<n; ++i) x+=(rand()<p?1:0);
genererà un binomio (n, p).
Ho bisogno di generare questo per n piccoli e molto grandi, per esempio n = 10^6 e p = 0.02. C'è un algoritmo numerico veloce per generarlo?
EDIT -
In questo momento questo è quello che ho come approssimazione (con funzioni per la precisa distribuzione di Poisson e Normale) -
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;
}
}
La distribuzione di Poisson funziona bene per 'n * p <10' o per' n * (1 - p) <10'? Come mai hai scelto quella distribuzione? – HelloGoodbye
Sì, per grande n. Binomiale (n, lambda/n) converge a Poisson (lambda), mentre n va all'infinito. – KalEl