Как-то раз, просматривая новостную ленту перед работой, я наткнулся на почти ничем не примечательную статью на нашем любимом Хабре. Статья эта очень близко пересказывает страницу из Википедии, которая называется «Парадокс мальчика и девочки». Примечательна эта статья на Хабре лишь тем, что под стандартным и общепринятым решением этой несложной задачи разразился почти что холивар на тему правильности решения/формулировки задачи и адекватности автора.
В этой статье я хотел бы вставить свои пять копеек и выразить несколько своих мыслей по этому поводу, которые накопились на небольшую статью. Основная их цель — найти способ объяснить решение этой задачи человеку, который знает тервер на самом базовом школьном уровне, и который не имеет никакой теоретико‑вероятностной интуиции (такие люди, в основном, и рождали споры в комментариях). Конечно, без базовых знаний в других областях математики не обойтись, но на мой взгляд, если такое объяснение существует, то это неплохая альтернатива классическому решению. Ибо истинное решение задачи из теорвера зачастую противоречит человеческой интуиции. Кстати, слово «парадокс» я взял в кавычки вместе с названием, так как считаю это не совсем парадоксом, а вполне себе задачей с однозначными формулировкой и решением. Парадокс возникает как раз при сопоставлении решения и человеческой интуиции.
Также заранее хочу обозначить тот факт, что все мысли, касающиеся не задачи, а природы человеческого мышления и понимания некоторых математических дисциплин, всего лишь моё мнение, причём, из области философии. А философское мнение не может быть истинным или ложным, поэтому прошу относиться к таким мыслям соответствующе.
Завязка
В начале хотелось бы коротко изложить стандартные формулировку и решение данной задачи, если кто‑то ещё не знает, о чём же она.
Формулировка достаточно проста:
Пусть вероятность рождения мальчика в любой семье равна 50%. Кроме мальчика, есть вероятность рождения девочки, которая тоже равна 50%. Пусть выбрана случайная семья с двумя детьми, один из которых — девочка. Какова вероятность того, что оба ребёнка — девочки.
Интуиция большинства людей подсказывает, что ответ — 50%. Ведь если мы выбрали семью с двумя детьми, один из которых девочка, то возможны два варианта — оба ребёнка девочки, или один из детей мальчик. Один исход благоприятный, всего два исхода, т. е. искомая вероятность равна 1/2 или же 50%.
Но интуиция, как я уже писал до этого, врёт в данной задаче. В одном из классических решений предлагается оценить долю семей с разнополой парой детей — она равна половине. Ведь старшим ребёнком с равной вероятностью может быть как мальчик, так и девочка. То же самое с младшим ребёнком. В итоге получаются следующие комбинации:
Вероятность |
Старший ребёнок |
Младший ребёнок |
25% |
Мальчик |
Мальчик |
25% |
Мальчик |
Девочка |
25% |
Девочка |
Мальчик |
25% |
Девочка |
Девочка |
Так как каждая комбинация имеет одинаковую вероятность, посчитать вероятность отдельной комбинации просто — можно либо поделить единицу на общее число исходов (4), либо умножить вероятность рождения старшего ребёнка с соответствующим полом (0.5) на вероятностью рождения младшего ребёнка с соответствующим полом (0.5), так как эти два события независимы.
Получается, что нужных комбинаций с двумя девочками всего лишь четверть от общего числа комбинаций. Если убрать комбинацию мальчик+мальчик, то в оставшемся множестве комбинаций девочка+девочка занимает всего треть:
Парадокс
Как я заметил, у многих людей появляется когнитивный диссонанс, когда они видят подобное решение, что и именуют «парадоксом» (Да, я знаю, выборка — всего лишь комментаторы с хабра, но всё же...). Основное непонимание вызывает у людей одно небольшое допущение в данном решении:
Зачем нам нумеровать детей? В условии же это не сказано. Есть только пара д‑м и пара д‑д, то есть, 50:50.
А что если родятся одновременно два ребёнка? Как их нумеровать?
Знаю, что для людей, знакомых с тервером не только по школьному курсу математики, очевидны ответы на все эти вопросы. Но, надеюсь, и этим людям будет интересно почитать мои мысли по поводу альтернативных решений, описанные в следующих главах. Для остальных людей спрячу свои мысли по поводу этих вопросов под спойлер.
Зачем нумеровать?
Мозг человека — самый развитый орган управления организмом среди всех известных человеку существ, не считая выдуманных. Все приятные и неприятные фичи разумных приматов мы получили с эволюцией для более успешных выживания и передачи генов своему потомству. Когда‑то нашим предкам в выживании помогала способность к абстрагированию, но сейчас это лишь удобный инструмент в мышлении и познании.
Соответственно, когда человек пытается понять что‑то новое или необычное, он часто вводит привычные абстракции, чтобы закрепить полученное знание в своей голове. Я веду к тому, что нумерация объектов — это всего лишь абстракция, которую придумал человек, чтобы можно было легко представить объёмы множеств комбинаций, описанных в задаче.
Вы можете не нумеровать (и достаточно успешно, как я покажу в одной из глав). От этого количество рождающихся разнополых пар детей в природе не изменится. Если вам проще не нумеровать, но держать в голове, что количество разнополых пар равно количеству однополых, то вы тоже можете решить эту задачу, просто исключив однополые пары м‑м. При этом, число разнополых пар не уменьшится, а число однополых уменьшится вдвое. Это объяснение такое же запутанное, как объяснение с нумерацией, поэтому не стал его выносить в отдельную главу, но, возможно, кому‑то оно откроет глаза.
По поводу близнецов, это объяснение покрывает только разнояйцевых. Конечно, однояйцевые близнецы будут вносить небольшую корректировку, но она слишком мала, чтобы её учитывать. К тому же, это больше математическая задача, поэтому у неё есть свои упрощения.
Алгоритмический подход
Первая мысль, которая пришла мне в голову, это попробовать объяснить задачу для той части людей, которые немного знакомы с компьютерами и программированием. В этом объяснении от нумерации всё равно не избавиться, но она будет менее навязчивой, чем в исходном решении.
Попробуем упростить процесс деторождения до простого алгоритма без входов (в данном случае) и с одним выходом — ребёнком определённого пола. Этот алгоритм всего‑лишь осуществляет выборку из самого простого распределения — распределения Бернулли. Таким же распределением пользуется природа, чтобы решить, какой стороной приземлится монетка на вашу ладонь.
Определившись с алгоритмом, мы получаем возможность описать его программным кодом для симуляции этого природного процесса. Результат симуляции даёт примерное значение реальной величины, которую можно было бы измерить напрямую у природного процесса, будь у нас нужные ресурсы и достаточно времени. Кроме того, сам процесс написания кода симуляции зачастую даёт интуитивное понимание сути симулируемого вероятностного процесса. Так в своё время, написав программу для симуляции игры из «Парадокса Монти Холла», я осознал истинность решения этого «парадокса» даже без запуска самой симуляции.
Писать симуляцию я буду на языке Python, так как код на нём будет легче всего прочитать и понять людям, которые не знакомы с этим языком. Начнём с алгоритма деторождения. Как я сказал, рождение ребёнка можно симулировать выборкой из распределения Бернулли (которое является частным случаем дискретного равномерного распределения):
pair = numpy.random.randint(low=0, high=2, size=2)
Функция randint из библиотеки numpy.random генерирует сразу два числа в диапазоне [low, high). В данном случае — либо 0, либо 1. Аргумент size=2 просит у numpy сгенерировать сразу два числа. Таким образом мы можем сгенерировать целую пару чисел, которые в своей голове можем заменить на нужный пол (Например, 0 = мальчик, 1 = девочка).
И где тут нумерация?
В классическом решении мы для простоты ввели понятия «первый ребёнок» (старший) и «второй ребёнок» (младший). А в данном случае мы сразу независимо генерируем два числа. То есть, мы избежали нумерации элементов пары?
Не совсем, ведь нумерация здесь неявно присутствует. Мы положились на реализацию, которую писали умные люди, но даже самый умный человек не может прыгнуть выше ограничений природы. В данном случае, последовательная природа любого алгоритма заставляет в любом случае генерировать эти два числа из пары последовательно — сначала одно число, потом другое.
Единственный способ избежать последовательной генерации — попросить процессор сгенерировать каждое число на отдельном ядре параллельно, то есть, одновременно. Но даже в таком случае человек придумал нумерацию — здесь это число, которое было сгенерировано на CPU0, и число, сгенерированное на CPU1:)
Но выборка из одной семьи ничтожна, вам любой статистик это скажет. Поэтому попробуем просимулировать, скажем, миллион деторождений и посмотреть на результаты. Всё, что нам нужно — это обернуть строчку с деторождением в цикл, и каждую итерацию «отбрасывать» семьи, в которых родилось оба мальчика.
Код симуляции получился небольшой и, надеюсь, понятный:
import numpy
# Число благоприятных исходов
count = 0
# Общее число исходов
total = 0
# Зерно ГСЧ для воспроизводимости результатов
numpy.random.seed(42)
for i in range(1_000_000):
# Генерируем пару деетй
pair = numpy.random.randint(low=0, high=2, size=2)
# Пропускаем пару М-М
if pair[0] == 0 and pair[1] == 0: continue
# Собираем статистику
total += 1
if pair[0] == 1 and pair[1] == 1:
count += 1
print(count/total)
В результате, программа мне выдала:
0.333578762875047
Это с достаточно высокой точностью равно 1/3. Симуляция подтверждает классическое решение задачи. А сам код помогает это решение понять и осознать. Или запутать? Когда мы генерируем два числа и проверяем их, мы всё равно вводим абстракцию «нумерации» — pair[0] и pair[1]. Да, похоже, когда мы выбираем пару любых объектов двух антагонистичных классов нам всегда придётся выбрать сначала первый объект, потом второй, т. е., так или иначе, их «пронумеровать». Или нет?
Графовый подход
Представим другую задачу. Пусть в бездонном мешке бесконечное число шаров красного и синего цветов (в математике возможно всё). Причём, шаров красного цвета и шаров синего цвета одинаковое количество. Ваш друг наугад вынул сразу два шарика, и сказал, что один из них красный. Какой шанс, что второй шарик тоже окажется красным?
Есть ли тут нумерация?
Да, наш друг не вытаскивает шары последовательно, поэтому нет такой дихотомии «первый шар»‑»второй шар». Но вы всегда можете найти любой другой способ придумать похожую дихотомию. Например, «мяч взят левой рукой»‑»мяч взят правой рукой». Но тогда вас должно устроить классическое решение, которое использует нумерацию. А здесь я предлагаю пока рассмотреть ту же ситуацию, какую рассматривали комментаторы со словами «а если родятся сразу два ребёнка?». То есть, а что, если выбираются не шары, а сразу пара?
Попробуем визуализировать эту задачу с помощью полносвязного графа, в котором вершинами будут шары соответствующих цветов, а рёбрами — возможные пары этих шаров. Тогда выбор пары шаров будет аналогичен выбору ребра графа.

Заметьте, что в данном графе отсутствуют рёбра между двумя синими шарами, так как заранее известно, что один шар из пары — красный. Итак, всё, что нам остаётся, это посчитать число рёбер между двумя красными шарами и поделить на общее число рёбер. Ведь выбор каждого ребра равновероятен.
В данном простом случае, когда шаров всего 10, необходимые нам величины можно посчитать визуально: 10 рёбер между двумя красными шарами и 25 рёбер всего. Итого, общая доля рёбер между двумя красными шарами: 10/25 = 0.4. Уже не половина. Давайте попробуем определить долю рёбер между двумя красными шарами в общем случае, и потом перейдём к случаю, когда число шаров бесконечно.
Предположим, что всего шаров в мешке 2N, а красных (и, соответственно, синих) шаров — N. Тогда число рёбер (вспоминаем комбинаторику) между двумя красными шарами:
Общее число рёбер:
Откуда эти формулы?
Всё достаточно просто. Пусть мы считаем число рёбер между двумя красными вершинами следующим образом: идём от левой вершины к правой и проводим ребро от текущей вершины ко всем вершинам справа. Тогда от первой вершины пройдёт N-1 рёбер, от второй вершины N-2, от третьей вершины N-3 и т. д. От последней вершины рёбер не будет, так как она самая правая, и правее неё вершин нет. Общее число рёбер тогда:
0 + 1 + 2 +... + (N-2) + (N-1).
Это сумма арифметической прогрессии, формулу для неё может вывести любой пятиклассник.
Теперь посчитаем оставшиеся рёбра, т. е. между красным и синим шарами, по той же схеме. Будем идти от крайнего левого шара к крайнему правому и проводить рёбра к каждому синему шару. От первого красного шара мы проведём N рёбер, от второго красного шара проведём N рёбер и так далее. Всего получается:
N + N + N... + N + N = N x N.
Прибавим это число к числу рёбер между двумя красными шарами и получим общее число рёбер.
Чтобы получить долю рёбер между двумя красными шарами от общего числа рёбер (т. е., вероятность выбора такого ребра), поделим число таких рёбер на общее число рёбер:
Чтобы перейти к исходному случаю, когда шаров в мешке бесконечность, устремим N к бесконечности (то же самое, что общее число шаров 2N устремить к бесконечности) и найдём предел:
Таким образом, вероятность, что ваш друг выбрал пару из двух красных шаров, если известно, что один из них красный, равна ровно трети. Как это связано с исходным «парадоксом»?
На самом деле, рождение двух детей аналогично выбору пары шаров из мешка, описанного в этой задаче. Природа точно так же выбирает из бесконечного количества возможных людей пару конкретных людей с конкретным полом. И при условии, что число людей среди этого бесконечного выбора одного пола равно числу людей другого пола, данный выбор сводится к такому же выбору ребра описанного графа.
Заключение
Своей статьёй я надеюсь, что хотя бы кому‑то помогу объяснить интуицию, лежащую в основе данного «парадокса». Жду вашу критику моих мыслей и интересное обсуждение в комментариях!