Условие
Вы с другом на прогулке. Ведущий предлагает конкурс: есть закрытая шумоизолированная палатка, в ней два мешка по 100 бильярдных шаров. В первом — шары с номерами на них, во втором — без номеров.
Ваш друг может зайти в палатку и переложить шары из одного мешка в другой (но не выносить и не оставлять снаружи).
После него вы заходите в палатку, и шары внутри каждого мешка перемешиваются. Цель — вытащить из мешка шар с номером. Тащите вслепую (не видите, что в мешке и сколько в нём шаров), вытащить можно только один.
Перед началом вы можете обсудить с другом стратегию. Какую выберете и почему?
Решение
Подход
Ключевая ловушка задачи: «вы не видите, в каком мешке сколько шаров». Поэтому стратегия «друг переложит все номерные в один мешок, а вы пойдёте к нему» не работает — вы не сможете отличить мешки. Палатка одинаковая снаружи; внутри 2 мешка, но какой из них «номерной» — неизвестно.
Значит, выбор мешка случайный (вы наугад выбираете один из двух). Стратегия должна быть симметричной: что бы вы ни вытащили из любого мешка — шанс «нумерованного» должен быть максимальным.
Реализация — анализ
Пусть после действий друга:
- В мешке X: номерных и ненумерованных шаров (всего ).
- В мешке Y: номерных и ненумерованных (всего ).
Вероятность вытащить номерной (выбираем мешок наугад):
При условии, что в каждом мешке должен быть хотя бы один шар (иначе вытащить нельзя — конкурс просто проигран). Значит, и .
Оптимальная стратегия — оставить в одном мешке ровно один номерной шар, а в другой переложить всё остальное (все 100 ненумерованных + 99 номерных).
Проверим:
- Мешок X: 1 номерной, 0 ненумерованных. Вероятность вытащить номерной = 1.
- Мешок Y: 99 номерных, 100 ненумерованных. Вероятность = 99 / 199.
Это ≈ 74.87% — почти ¾.
Почему именно эта стратегия оптимальна
Оптимизируем по при ограничениях , , , .
Если в мешке X оставить только номерные (b = 0), то P_X = 1. Потеря — все 100 ненумерованных в Y «портят» дробь 99/199.
Можно ли улучшить? Что если поделить пополам: 50/50 в каждом? Тогда . Хуже.
А если оставить в X 2 номерных (b = 0)? P_X = 1, P_Y = 98/198. P = 0.5 + 98/396 ≈ 0.7475. Чуть хуже, чем «один номерной».
Интуиция: чем меньше нелюбимых шаров портят «маленький мешок» и чем больше номерных в «большом», тем лучше — но граничное условие «нельзя оставить пустой мешок» заставляет оставить хотя бы один шар. Один номерной в малом мешке — оптимальная граница.
Симуляция (sanity check)
import random
def simulate(a_num, a_unnum, b_num, b_unnum, trials=1_000_000):
wins = 0
for _ in range(trials):
bag = random.choice(["A", "B"])
if bag == "A":
num, unnum = a_num, a_unnum
else:
num, unnum = b_num, b_unnum
if num + unnum == 0:
continue
wins += random.random() < num / (num + unnum)
return wins / trials
print(simulate(1, 0, 99, 100)) # ~0.7487
print(simulate(50, 50, 50, 50)) # ~0.5Подводные камни
- «Друг скажет, в каком мешке номерные». Не сработает — мешки одинаковые снаружи, перемешиваются после, вы не знаете, какой из них.
- Оставить мешок пустым. Запрещено условием — шары нельзя выносить из палатки.
- Идея «положить только один тип в один мешок» на 50/50. Это стратегия — но не «оставить только номерные с одной стороны». Оптимум — асимметричное деление: один номерной в один мешок, всё остальное — в другой.
- Расчёт без учёта случайного выбора мешка. Забываем фактор
1/2— получаем 1 вместо 0.7487. - Симметричная игра не равна симметричному раскладу. Симметрия по выбору мешка не означает, что нужно симметрично раскладывать шары.
Эталонный ответ
Стратегия: друг перекладывает шары так, чтобы в одном мешке остался ровно один номерной шар, а все остальные (99 номерных + 100 ненумерованных) — в другом мешке.
Вероятность успеха: .
Почему: вы не знаете, какой мешок где, поэтому выбор мешка случайный. Оптимум — сделать в одном мешке шанс 100% (один номерной), а в другом — близкий к 50%. Среднее ≈ 75%.