Випробування Бернуллі — це експеримент з двома можливими наслідками:
Успіх (подія відбувається) з ймовірністю ,
Невдача (подія не відбувається) з ймовірністю 1 - p.
Випробування називається "бернуллівським", якщо воно незалежне і ймовірність його успіху залишається сталою протягом усіх випробувань.
Схема випробувань Бернуллі — це серія незалежних випробувань, кожне з яких є випробуванням Бернуллі. Позначимо кількість випробувань через . У кожному випробуванні ймовірність успіху та невдачі 1 - p залишаються незмінними.
Прикладом може служити багаторазове підкидання монети. Якщо нас цікавить, скільки разів випаде орел з підкидань, то це і буде схема випробувань Бернуллі.
Число успіхів у серії з випробувань Бернуллі підпорядковується біноміальному розподілу. Нехай — випадкова величина, яка позначає число успіхів у випробуваннях. Тоді:
де
— ймовірність успіху в кожному випробуванні,
— кількість успіхів з випробувань.
Доведення. Розглянемо конкретну послідовність випробувань, в якій:
випробувань успішні (ймовірність успіху )
n - k випробувань невдалі (ймовірність невдачі q = 1 - p)
Оскільки випробування незалежні, ймовірність цієї конкретної послідовності дорівнює добутку ймовірностей окремих випробувань:
Щоб отримати рівно успіхів, необхідно вибрати, у яких саме місцях вони відбуватимуться. Число таких способів дорівнює числу сполучень C_n^k.
Отже, ймовірність того, що буде рівно успіхів, дорівнює
Для обчислення значення біноміального коефіцієнта в дійсних числах скористаємося таким прийомом:
Відомо, що ln~n! = ln~(1 \cdot 2 \cdot ... \cdot n) = ln~1 + ln~2 + ... + ln~n
Значення запам'ятовуємо в комірках масиву . Далі обчислюємо
після чого
Приклад
У першому тесті проводиться n = 8 випробувань. Ймовірність настання події в кожному випробуванні дорівнює p = 0.3. Ми хочемо знайти ймовірність того, що подія відбудеться рівно k = 2 рази. Шукана ймовірність дорівнює:
Реалізація алгоритму
Оголосимо робочий масив , де 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);