Вероятность, что все события произойдут в разные дни недели
В комбинаторике и теории вероятностей часто встречаются задачи, где нужно оценить шанс, что несколько независимых событий попадут на разные дни недели. Разберём классический пример: в течение недели независимо друг от друга происходят 4 события. Какова вероятность, что все они произойдут в разные дни?
Два подхода к решению задачи
Рассмотрим два способа расчёта: с учётом порядка событий (нумерованные) и без учёта порядка (непронумерованные). Оба дают разные результаты, так как моделируют разные комбинаторные пространства.
Способ 1: пронумерованные события
Каждое событие может произойти в любой из 7 дней. Общее число возможных последовательностей: 7^4 = 2401. Благоприятные исходы - когда все 4 дня различны: 7 * 6 * 5 * 4 = 840. Вероятность: 840 / 2401 ≈ 0.35.
Этот подход соответствует размещению (A) - порядок событий важен. Например, событие 1 в понедельник, событие 2 во вторник - это отдельная комбинация.
Способ 2: непронумерованные события
Если порядок не важен, мы работаем с сочетаниями с повторениями. Общее число наборов: C(4, 10) = 210. Благоприятные наборы (все дни разные): C(4, 7) = 35. Вероятность: 35 / 210 ≈ 0.1667.
Здесь набор {пн, вт, ср, чт} считается одним исходом, независимо от того, какое событие когда произошло.
Симуляция на Python: примеры кода
Для проверки расчётов можно написать симуляцию. В первом случае генерируем случайное слово из 7 букв длины 4 - это размещение. Код использует random.randint() в цикле.
import random
n_trials = 100000
success = 0
for _ in range(n_trials):
days = [random.randint(0, 6) for _ in range(4)]
if len(set(days)) == 4:
success += 1
print(success / n_trials)Во втором случае нужно симулировать сочетания - то есть случайный выбор набора дней без учёта порядка. Прямая генерация через random.choice из всех возможных наборов требует хранения списка размером O(210), что приемлемо для малых чисел, но экспоненциально растёт при увеличении параметров.
Как симулировать сочетания (C) без перебора всех наборов?
Классический способ - использовать алгоритм случайной выборки без повторений из множества. Для нашей задачи: сгенерировать 4 случайных различных дня (как в первом способе), а затем отсортировать их - это даст набор, равновероятный среди всех сочетаний. Однако такой метод не даёт точного моделирования сочетаний с повторениями, если дни могут повторяться. Для сочетаний с повторениями можно применить мультиномиальную симуляцию или алгоритм «звёзд и полос».
Практические рекомендации
- Если порядок событий имеет значение (например, последовательные броски), используйте размещения (A).
- Если порядок не важен (например, просто набор дат), используйте сочетания (C).
- Для симуляции сочетаний с повторениями в коде применяйте генерацию случайного мультинабора через биномиальные коэффициенты.
Понимание разницы между размещением и сочетанием помогает избежать ошибок в расчётах и симуляциях.