Симуляция событий: операции над вероятностями

Учимся комбинировать события: объединение, пересечение, дополнение — и проверяем правила экспериментом.

Независимые события — события, для которых наступление одного не меняет вероятность другого; тогда вероятность их совместного наступления равна произведению вероятностей.

Реальные вопросы редко про один исход. «Какова вероятность, что хотя бы один из двух кубиков покажет шестёрку?» «Что оба теста дадут положительный результат?» Чтобы отвечать, нужны правила комбинирования вероятностей. Их немного, и каждое легко проверить симуляцией. Сначала договоримся о языке. События — это подмножества всех возможных исходов: «выпала шестёрка» — это один исход из шести, «выпало чётное» — три исхода. Над событиями определены те же операции, что над множествами: объединение «$A$ или $B$» (хотя бы одно из них), пересечение «$A$ и $B$» (оба сразу) и дополнение «не $A$» (всё, кроме $A$). Вероятность — это как бы «вес» события, и правила комбинирования говорят, как веса складываются и перемножаются при этих операциях. Освоив три-четыре правила, вы сможете разложить почти любую задачу на простые кирпичики и собрать ответ, ни разу не перечисляя все исходы вручную.

Дополнение и объединение

Вероятность того, что событие не произойдёт, равна

$$P(\bar{A})=1-P(A).$$

Для объединения двух событий действует формула включений-исключений:

$$P(A\cup B)=P(A)+P(B)-P(A\cap B).$$

Вычитаемое нужно, чтобы не посчитать дважды исходы, попадающие в оба события. Проверим на двух кубиках событие «выпала хотя бы одна шестёрка». Здесь $P(A)=P(B)=\frac{1}{6}$, а $P(A\cap B)=\frac{1}{36}$, поэтому теория даёт $\frac{1}{6}+\frac{1}{6}-\frac{1}{36}=\frac{11}{36}\approx 0{,}3056$.

import random
random.seed(5)

n = 600000
hits = 0
for _ in range(n):
    a = random.randint(1, 6)
    b = random.randint(1, 6)
    if a == 6 or b == 6:
        hits += 1
print("Симуляция:", round(hits / n, 4))
print("Теория 11/36:", round(11/36, 4))

Вывод:

Симуляция: 0.3060
Теория 11/36: 0.3056

Через дополнение проще

Часто «хотя бы один» удобнее считать через противоположное событие «ни одного». Вероятность, что шестёрки нет ни на одном кубике, равна $\left(\frac{5}{6}\right)^2$, поэтому

$$P(\text{хотя бы одна шестёрка})=1-\left(\frac{5}{6}\right)^2=\frac{11}{36}.$$

Этот приём незаменим, когда событий много: считать «ни одного» проще, чем перебирать все варианты «хотя бы одного».

Умножение для независимых событий

Если события независимы, вероятность совместного наступления — произведение:

$$P(A\cap B)=P(A)\cdot P(B).$$

import random
random.seed(9)

n = 600000
both = sum(1 for _ in range(n)
           if random.randint(1, 6) == 6 and random.randint(1, 6) == 6)
print("Симуляция:", round(both / n, 4))
print("Теория 1/36:", round(1/36, 4))

Вывод:

Симуляция: 0.0277
Теория 1/36: 0.0278

Как работает под капотом

Когда мы пишем два независимых вызова random.randint, генератор выдаёт два числа, статистически не связанных между собой. Поэтому доля пар, где оба равны шести, естественным образом стремится к произведению одиночных долей. Формула включений-исключений работает потому, что в сумме $P(A)+P(B)$ исходы из пересечения учтены дважды; вычитая $P(A\cap B)$, мы восстанавливаем справедливость. Симуляция же ничего не «знает» о формулах — она просто считает доли, и совпадение с теорией подтверждает, что наши рассуждения верны.

Частые ошибки

Главная ошибка — складывать вероятности объединения без вычитания пересечения, когда события могут происходить вместе. Это даёт завышенный ответ (например, $\frac{2}{6}$ вместо $\frac{11}{36}$). Вторая — применять правило умножения к зависимым событиям: если вторая карта тянется из той же колоды без возврата, события зависимы и $P(A\cap B)\neq P(A)P(B)$. Третья — путать «и» с «или»: «обе шестёрки» и «хотя бы одна шестёрка» — совершенно разные события с разными вероятностями.

Итог

  • Дополнение: $P(\bar{A})=1-P(A)$ — лучший друг для задач «хотя бы один».
  • Объединение: вычитайте пересечение, чтобы не считать исходы дважды.
  • Умножение вероятностей работает только для независимых событий.
  • Симуляция подтверждает каждое правило, считая доли исходов.
Проверьте себя
1. Чему равна вероятность объединения P(A ∪ B)?
AP(A) + P(B)
BP(A) + P(B) − P(A ∩ B)
CP(A) · P(B)
D1 − P(A) · P(B)
2. Как проще всего найти вероятность события «хотя бы один успех»?
AСложить все вероятности успехов
BЧерез дополнение: 1 минус вероятность «ни одного»
CПеремножить вероятности неудач
DПоделить на число испытаний
3. Когда верно P(A ∩ B) = P(A)·P(B)?
AВсегда
BТолько если события независимы
CТолько если события несовместны
DТолько для кубиков