Построить распределение вероятностей для случайной величины python

В задаче ученик сдает 6 независящих друг от друга экзаменов; вероятность не сдать каждый - 15%

from matplotlib import pyplot as plt
from math import factorial

n_exams = 6
failure_rate = 0.15

distr = []

Необходимо с помощью цикла посчитать вероятности не сдать 0,1,2,3 ... 6 экзаменов и записать их в список

Моя попытка:

for k in range(0, n_exams + 1):
    distr.append(
        failure_rate ** k
    ) 

результат:

[1.0, 0.15, 0.0225, 0.0033749999999999995, 0.00050625, 7.593749999999998e-05, 1.1390624999999997e-05]

Все так(вроде) кроме первого элемента в списке (ученик сдаст все экзамены)


Ответы (2 шт):

Автор решения: MBo

Ну что-то продвижения не видно. Давайте разберёмся.

Пусть вероятность провала одного экзамена f (fault), а сдачи s=1-f (success)

Если независимо сдаётся n экзаменов, то событие "провалено ровно k из них" означает, что мы можем выбрать одно из сочетаний (k из n) проваленных экзаменов, и таких сочетаний, как нам говорит комбинаторика,

 C(n,k)=n!/(k!(n-k)!)

Вероятность каждого одиночного сочетания есть произведение вероятностей событий - k провалено, и (n-k) сдано, т.е.

p = f^k * s^(n-k) 

а суммарная вероятность всех вариантов

P(n,k,f,s) = C(n,k) * f^k * s^(n-k)

Вот и получили биномиальное распределение (и стоит почитать учебник мадам Вентцель, она же писательница И.Грекова)

Итого:

from math import comb

f = 0.15
s = 1 - f
n = 6
P = [comb(n,k) * f**k * s**(n-k) for k in range(n+1)]
print(P)

[0.37714951562499993, 0.39933478124999994, 0.17617710937499995,
 0.04145343749999999, 0.005486484375, 0.0003872812499999999, 
 1.1390624999999997e-05]
→ Ссылка
Автор решения: Harry

Вам нужно биномиальное распределение. "В лоб":

import math
p = 0.15
q = 1 - p

def prob(n):
    return math.factorial(6)/math.factorial(n)/math.factorial(6-n)*p**n*q**(6-n)


for i in range(0,7):
    print(i, prob(i))

Это - вероятности не сдать соответствующее количество экзаменов

→ Ссылка