Разбор
Испытание Бернулли — это эксперимент с двумя возможными исходами:
Успех (событие происходит) с вероятностью ,
Неудача (событие не происходит) с вероятностью .
Испытание называется "бернуллиевским", если оно независимое и вероятность его успеха остаётся постоянной на протяжении всех испытаний.
Схема испытаний Бернулли — это серия независимых испытаний, каждое из которых является испытанием Бернулли. Обозначим количество испытаний через . В каждом испытании вероятность успеха и неудачи остаются неизменными.
Примером может служить многократное подбрасывание монеты. Если нас интересует, сколько раз выпадет орел из подбрасываний, то это и будет схема испытаний Бернулли.
Число успехов в серии из испытаний Бернулли подчиняется биномиальному распределению. Пусть — случайная величина, которая обозначает число успехов в испытаниях. Тогда:
где
— вероятность успеха в каждом испытании,
— количество успехов из испытаний.
Для вычисления значения биномиального коэффициента в действительных числах воспользуемся следующим приемом:
Известно, что
Значения запоминаем в ячейках массива . Далее вычисляем
после чего
Пример
В первом тесте проводится испытаний. Вероятность наступления события в каждом испытании равна . Мы хотим найти вероятность того, что событие произойдет ровно раза. Искомая вероятность равна:
Реализация алгоритма
Объявим рабочий массив , где .
#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 = lf[n] - lf[k] - lf[n - k]; res = exp(res);
Вычисляем ответ .
for (i = 0; i < k; i++) res = res * p; for (i = 0; i < n - k; i++) res = res * q;
Выводим ответ.
printf("%lf\n", res);