оценка вероятности того, что у 3 человек будет день рождения - PullRequest
1 голос
/ 14 февраля 2011

В Интернете имеются обширные ресурсы, в которых обсуждается знаменитый парадокс дня рождения.Мне понятно, как вы рассчитываете вероятность того, что у двух человек будет день рождения, то есть P (s) = 1-P (d).Однако, если я спрашиваю себя о чем-то более простом, я задерживаюсь: во-первых, скажем, я генерирую два случайных дня рождения.Получить тот же день рождения, как бросить монетку.Либо у двух человек день рождения (Главы), либо у них нет Дня рождения (Хвост).Выполните это 500 раз, и конечный результат (nbr Heads / 500) будет как-то близок к 0,5

Но как мне об этом подумать, если я сгенерирую три случайных дня рождения?Как я могу оценить вероятность тогда?Очевидно, что моя аналогия с монетами неприменима.

часть 2 моего вопроса: как только я разберусь с вышесказанным, мне нужно будет увеличить ее и создать 30 или 50 дней рождения.Существует ли рекомендуемая методика или алгоритм для выделения идентичных дней рождения из большого набора?Должен ли я положить их в массивы и перебрать их?

спасибо


вот что мне нужно:

part1

r = 25, т.е. каждый пробный прогон генерирует 25 дней рождения

Пробная версия 1> 3 дубликата: 0

Пробная версия 2> 3 дубликата: 0

Пробная версия 3> 3 дубликата: 2

Пробная версия 4> 3 дубликата: 1

...

T100> 3 дубликата: 2

предполагаемая вероятность того, что у 3 человек будет день рожденияв комнате 25 = (0 + 0 + 2 + 1 + ... + 2) / 100

part 2

создать массив для 2 дубликатов,массив для 3 дубликатов и один для более чем 3 дубликатов

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

, хотя это не кажется очень эффективным алгоритмом :) предложения по улучшению Big O здесь?

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Создайте целочисленный массив длиной 365, инициализированный равным 0. Затем сгенерируйте N (в вашем случае 25) случайных чисел в диапазоне 1-365 и увеличьте это число в массиве (т. Е. Bdays [random_value] ++). Поскольку вас интересует только коллизия, сразу после увеличения числа в массиве проверьте, не превышает ли он 2 (если это так, то происходит вторая коллизия, что означает, что есть 3 человека с одинаковым днем ​​рождения). Следите за столкновениями и выполняйте их столько раз, сколько хотите (1000).

В итоге, соотношение столкновений / 1000 будет вашим запрошенным значением.

и, аналогия с подбрасыванием монет неверна.

0 голосов
/ 15 февраля 2011

Похоже, вашей первой задачей будет создание метода, который будет генерировать случайные дни рождения.Для простоты вы можете использовать цифры 1-365 для обозначения уникальных дней рождения.

Сохраняйте как можно больше случайных дней рождения (2 в первом случае позже) в ArrayList как Strings.Вы захотите использовать цикл для вызова функции случайного числа и сохранения значения в вашем списке.

Затем создайте функцию для поиска дубликатов в ArrayList.Если есть какие-либо дубликаты (независимо от того, сколько), то это результат Heads.Если совпадений нет, то это Хвосты.

Ваши вероятности будут сильно отличаться от 50/50, пока вы не достигнете 20 или около того.

0 голосов
/ 14 февраля 2011

Отметьте этот аналогичный вопрос и ответы на него на CrossValidated, но я думаю, что действительно стоит снова подумать о классической задаче дня рождения, чтобы получить основы.

Ко второй части вашего вопроса: зависит от используемого вами языка. Я определенно предлагаю использовать R для решения подобной проблемы, поскольку проверка идентичных дней рождения в кадре списка / вектора / данных может быть легко выполнена с помощью простого вызова unique. Чтобы запустить такое простое моделирование MC снова очень удобно, проверьте второй ответ по ссылке выше.

...