Schema di Bernoulli#11726

Schema di Bernoulli (Editoriale)

Prova di Bernoulli — è un esperimento con due possibili esiti:

Una prova si definisce "bernoulliana" se è indipendente e la probabilità di successo rimane costante durante tutte le prove.

Schema delle prove di Bernoulli — è una serie di prove indipendenti, ognuna delle quali è una prova di Bernoulli. Indichiamo il numero di prove con . In ogni prova, la probabilità di successo e di insuccesso 1 - p restano invariate.

Un esempio può essere il lancio ripetuto di una moneta. Se siamo interessati a quante volte uscirà testa su lanci, questo è proprio lo schema delle prove di Bernoulli.

Il numero di successi in una serie di prove di Bernoulli segue una distribuzione binomiale. Sia — la variabile casuale che indica il numero di successi in prove. Allora:

P(X = k) = C_n^k \cdot p^k \cdot (1 - p)^{n - k}

dove

Dimostrazione. Consideriamo una specifica sequenza di prove, in cui:

Poiché le prove sono indipendenti, la probabilità di questa specifica sequenza è uguale al prodotto delle probabilità delle singole prove:

Per ottenere esattamente successi, è necessario scegliere in quali precise posizioni essi si verificheranno. Il numero di tali modi è uguale al numero di combinazioni C_n^k.

Di conseguenza, la probabilità che si verifichino esattamente successi è uguale a

P(X = k) = C_n^k \cdot p^k \cdot (1 - p)^{n - k}

Per calcolare il valore del coefficiente binomiale nei numeri reali, utilizziamo il seguente accorgimento:

C_n^k = {n! \over k! (n - k)!}, \\ ln~C_n^k = ln~n! - ln~k! - ln~(n - k)!

È noto che ln~n! = ln~(1 \cdot 2 \cdot ... \cdot n) = ln~1 + ln~2 + ... + ln~n

I valori di vengono memorizzati nelle celle dell'array . Successivamente calcoliamo

res = ln~n! - ln~k! - ln~(n - k)! = lf[n] - lf[k] - lf[n - k],

dopodiché

C_n^k = e^{res}

Esempio

Nel primo test vengono effettuate n = 8 prove. La probabilità del verificarsi dell'evento in ogni prova è pari a p = 0.3. Vogliamo trovare la probabilità che l'evento si verifichi esattamente k = 2 volte. La probabilità cercata è pari a:

P(X = 2) = C_8^2 \cdot 0.3^2 \cdot 0.7^6 ≈ 0.296475

Implementazione dell'algoritmo

Dichiariamo un array di lavoro , dove lf[i] = ln~i! = ln~1 + ln~2 + ... + ln~i.

#define MAX 1001
double lf[MAX];

Leggiamo i dati in ingresso.

scanf("%d %d", &n, &k);
scanf("%lf", &p);
q = 1 - p;

Riempiamo l'array .

lf[1] = 0;
for (i = 2; i <= n; i++)
  lf[i] = lf[i - 1] + log(i);

Calcoliamo il valore del coefficiente binomiale res = C_n^k.

res = lf[n] - lf[k] - lf[n - k];
res = exp(res);

Calcoliamo la risposta res = C_n^k \cdot p^k \cdot (1 - p)^{n - k}.

for (i = 0; i < k; i++)
  res = res * p;
for (i = 0; i < n - k; i++)
  res = res * q;

Stampiamo la risposta.

printf("%lf\n", res);