Функции гипергеометрического распределения случайной величины, приведенные здесь, можно использовать с любым количеством множеств. Данные функции основаны на формуле Лапласа.
Первая функция позволяет рассчитать гипергеометрическую вероятность для одного события, а вторая для последовательности событий. В обоих функциях требуется соблюдать последовательность размещения множеств в списках (массивах). Во второй функции для чистоты результата требуется использовать одинаковое количество множеств элементов во всех событиях последовательности.
Решение на Python:
import math
from fractions import Fraction # Дроби
# Гипергеометрическое распределение случайной величины
# для одного события с любым количеством множеств элементов.
# ФУНКЦИИ
# Биноминальный коэффициент
def binomial_coefficient(n, k):
a = math.factorial(n)
b = math.factorial(k)
c = math.factorial(n-k)
return a/(b*c)
# Гиперметрическое распределение
# случайной величины.
# Для решения нужно задать:
# M = количество элементов в множествах;
# m = количество элементов множеств в выборке.
# Порядок и количество множеств в M и m должны совпадать.
def hypermetric_distibution(M, m):
if len(M) == len(m):
ab = 1
i = 0
while i < len(M):
if M[i] < m[i]: return 0
ab *= binomial_coefficient(M[i], m[i])
i += 1
return ab/binomial_coefficient(sum(M), sum(m))
return 0
# ВВОД ДАННЫХ
# Количество элементов в множествах
# (это элементы, участвующие в одном событии)
M = [4, 10, 15]
# Количество элементов множеств в выборке
m = [1, 1, 3]
# РЕШЕНИЕ
P = hypermetric_distibution(M, m)
# ВЫВОД
print("P =", P, "=", Fraction(P).limit_denominator(100000))
P = 0.1532567049808429 = 40/261
# Гипергеометрическое распределение случайной величины
# для последовательности событий
# с одинаковым количеством множеств элементов.
# ФУНКЦИИ
# M - Количество элементов в множествах ([события][элементы])
# k - Количество элементов множеств в выборке
def hypermetric_distibution_set(M, m):
if len(M) == len(m) and len(M[0]) == len(m[0]):
p = []
pdot = 1
i = 0
while i < len(M):
p.append(hypermetric_distibution(M[i], m[i]))
pdot *= p[i]
i += 1
return [pdot, p]
return 0
# ВВОД ДАННЫХ
# Количество элементов в множествах ([события][элементы])
M = [[2, 1], [1, 1]]
# Количество элементов множеств в выборке
m = [[1, 0], [1, 0]]
# Пример. Вероятность того, что могут быть
# вытянуты последовательно все 4 туза из колоды
M = [[4, 32], [3, 32], [2, 32], [1, 32]]
m = [[1, 0], [1, 0], [1, 0], [1, 0]]
# РЕШЕНИЕ
P = hypermetric_distibution_set(M, m)
# ВЫВОД
print("P =", P[0], "=", Fraction(P[0]).limit_denominator(100000))
for i in P[1]:
print(i, "=", Fraction(i).limit_denominator(100000))
P = 1.697648756472286e-05 = 1.697648756472286e-05 = 1/58905
0.1111111111111111 = 1/9
0.08571428571428572 = 3/35
0.058823529411764705 = 1/17
0.030303030303030304 = 1/33