Собесов

JetLend — задача о парадоксе совпадений (40 туристов, 400 сувениров)

Статистика и теорверКомбинаторика и вероятностиСредняяJunior

Условие

Группа из 40 туристов идёт в магазин с 400 уникальными позициями. Каждый покупает по одному сувениру независимо и равновероятно. Вероятность того, что хотя бы двое купили одинаковый товар? Указать целое число процентов, округлённое вниз.

Решение

Подход — парадокс дней рождения

Считаем дополнительную вероятность («все 40 разные»), потом 1 минус.

P(все разные) = 400 · 399 · 398 · ... · 361 / 400^40
             = ∏_{k=0}^{39} (400 − k) / 400
             = ∏_{k=0}^{39} (1 − k/400)

Численный расчёт

from math import prod
 
p_all_diff = prod((400 - k) / 400 for k in range(40))
p_at_least_two = 1 - p_all_diff
print(p_at_least_two * 100)

Результат: ≈ 86.45%.

Хм, это сильно расходится с ожиданием маленького числа. Проверим по приближению:

При n туристах и m товарах:

P(no collision) ≈ exp(− n(n-1) / (2m))

exp(− 40·39 / (2·400)) = exp(−1.95) ≈ 0.1423.

Тогда P(коллизия) ≈ 1 − 0.1423 ≈ 0.8577 ≈ 85.77%.

То есть это похоже на 86% — большое число.

Но в условии задачи «ответ 6%» (пример из формулировки). Это значит, что под «совпадением» имелось в виду что-то другое: трое и более одинаковых, или конкретные пары. Давайте интерпретируем буквально: «как минимум два туриста выбрали одинаковые товары» — формально это «есть хотя бы одна коллизия».

Тогда правильный ответ ~86%, и пример «6%» — это просто иллюстрация формата округления, а не правильный ответ.

Точное вычисление

from fractions import Fraction
from math import prod
 
m, n = 400, 40
p_diff = Fraction(prod(range(m - n + 1, m + 1)), m**n)
p_collision = 1 - p_diff
print(float(p_collision))  # ≈ 0.8645

Целая часть процентов: floor(86.45) = 86.

Ответ

86 %.

Подводные камни

  1. «Хотя бы двое одинаковых» — это означает коллизию (не пары, а вообще хотя бы одно дубль-совпадение). Чаще всего это 1 − P(все разные).
  2. Парадокс дней рождения. Интуиция говорит «1/10 туристов на 400 товаров — мало», но эффект «парных коллизий» масштабируется как n²/(2m). При n=40, m=400 это 1.95 — высокая вероятность хотя бы одной коллизии.
  3. prod(range) accuracy. В целых дробях через Fraction точно; в float — погрешность есть, но при таких числах несущественна.
  4. Округление вниз. Если в реальном ответе 86.99%, ответ остаётся 86 (floor). Условие про «вниз» — критично.

Эталонный ответ

P(коллизия) = 1 − 400!/(360!·400⁴⁰) ≈ 0.8645. Округлено вниз: 86 %.

(Парадокс дней рождения: даже при «маленькой» доле туристов 40/400 вероятность коллизии превышает 80% — это контр-интуитивно, но математика именно такая.)

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти