Схема Бернуллі#11726

Схема Бернуллі (Розбір)

Випробування Бернуллі — це експеримент з двома можливими наслідками:

Випробування називається "бернуллівським", якщо воно незалежне і ймовірність його успіху залишається сталою протягом усіх випробувань.

Схема випробувань Бернуллі — це серія незалежних випробувань, кожне з яких є випробуванням Бернуллі. Позначимо кількість випробувань через . У кожному випробуванні ймовірність успіху та невдачі 1 - p залишаються незмінними.

Прикладом може служити багаторазове підкидання монети. Якщо нас цікавить, скільки разів випаде орел з підкидань, то це і буде схема випробувань Бернуллі.

Число успіхів у серії з випробувань Бернуллі підпорядковується біноміальному розподілу. Нехай — випадкова величина, яка позначає число успіхів у випробуваннях. Тоді:

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

де

Доведення. Розглянемо конкретну послідовність випробувань, в якій:

Оскільки випробування незалежні, ймовірність цієї конкретної послідовності дорівнює добутку ймовірностей окремих випробувань:

Щоб отримати рівно успіхів, необхідно вибрати, у яких саме місцях вони відбуватимуться. Число таких способів дорівнює числу сполучень C_n^k.

Отже, ймовірність того, що буде рівно успіхів, дорівнює

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

Для обчислення значення біноміального коефіцієнта в дійсних числах скористаємося таким прийомом:

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

Відомо, що ln~n! = ln~(1 \cdot 2 \cdot ... \cdot n) = ln~1 + ln~2 + ... + ln~n

Значення запам'ятовуємо в комірках масиву . Далі обчислюємо

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

після чого

C_n^k = e^{res}

Приклад

У першому тесті проводиться n = 8 випробувань. Ймовірність настання події в кожному випробуванні дорівнює p = 0.3. Ми хочемо знайти ймовірність того, що подія відбудеться рівно k = 2 рази. Шукана ймовірність дорівнює:

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

Реалізація алгоритму

Оголосимо робочий масив , де lf[i] = ln~i! = ln~1 + ln~2 + ... + ln~i.

#define MAX 1001
double lf[MAX];

Читаємо вхідні дані.

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

Заповнюємо масив .

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

Обчислюємо значення біноміального коефіцієнта res = C_n^k.

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

Обчислюємо відповідь 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;

Виводимо відповідь.

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