Парадокс дня рождения в Python с методом Монте-Карло?

Попытка найти наименьшее число людей, необходимое для «входа» в комнату, чтобы иметь вероятность не менее 50% для двух людей, у которых один и тот же день рождения, используя метод Монте-Карло (хорошо известное решение — 23 человека, но я не могу чтобы найти мои ошибки в логике или реализации)


person astralled    schedule 27.09.2019    source источник


Ответы (1)


Ошибка заключается в выражении того, как вы ищете существующую дату:

if date in [dates]:

Давайте просто возьмем случай, когда вы уже нашли даты 3 и 15, и вы только что нарисовали еще один день рождения 15. Этот оператор проверки оценивается как

if 15 in [ [3, 15] ]:

Это False! Выражение справа содержит один элемент — список. Не может быть, чтобы целое число (15) и список ([3, 15]) были равны, поэтому проверка всегда завершается ошибкой. Вместо этого используйте проверку in, как показано в ваших руководствах:

if date in dates:

Выход:

double birthday 1
double birthday 2
double birthday 3
double birthday 4
double birthday 5
double birthday 6
double birthday 7
double birthday 8
double birthday 9
double birthday 10
double birthday 11
double birthday 12
double birthday 13
13.0

Да, у вас есть еще пара ошибок в вашем коде. Вы напечатали счетчик вместо даты дублирования и сбрасываете counter каждый раз в цикле, поэтому ваша окончательная пропорция всегда делится на 1.

Как только вы их исправите, вывод будет выглядеть так

double birthday 204
double birthday 40
double birthday 268
double birthday 260
double birthday 188
double birthday 136
double birthday 324
0.07

Наконец, в вашем описании проблемы говорится, что вы выходите из цикла, когда находите дубликат. Как видно из приведенного выше вывода, это не то, что вы делаете. Для этого вам понадобится оператор break.

person Prune    schedule 27.09.2019