Фон
У меня есть коллекция «носков дня недели», которые представляют собой семь пар носков, помеченных по дням недели. Когда я стираю свои носки, они оказываются в куче, и я должен расположить их в правильные пары, прежде чем положить их в шкаф. Моя стратегия - вытащить один случайный носок из кучи за раз и положить его в ящик. Всякий раз, когда на ящике есть подходящая пара носков, я связываю их и кладу в шкаф. Ваша задача - смоделировать этот случайный процесс и вернуть количество розыгрышей, необходимое для поиска первой подходящей пары.
вход
Ваш ввод - целое число N ≥ 1 . Он представляет собой «количество дней в неделе»: в стопке N пар носков, и каждая пара имеет свою метку. При необходимости вы также можете использовать начальное значение PRNG.
Выход
Ваш вывод - это количество носков, которые я должен нарисовать до того, как будет найдена первая подходящая пара. Например, если первые два носка уже образуют совпадающую пару, вывод будет 2
.
Конечно, вывод является случайным и зависит от порядка рисования. Мы предполагаем, что все порядки отрисовки одинаково вероятны , поэтому каждый раз, когда рисуется носок, выбор является равномерным и независимым от всех других вариантов.
пример
Пусть N = 3 , так что у нас всего 6 носков, помеченных AABBCC . Один из возможных вариантов «протокола рисования носков» выглядит следующим образом:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
Первая подходящая пара была найдена после рисования второго B , который был третьим носком, который нужно нарисовать, поэтому правильный вывод 3
.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены. Ввод и вывод могут быть в любом разумном формате, включая унарный (строка 1
s).
Вы можете предположить, что встроенный в ваш язык RNG идеален. Вам не нужно фактически моделировать протокол рисования носков, если ваши выходные данные имеют правильное распределение вероятностей.
«Тестовые случаи»
Вот приблизительные вероятности всех выходов для входа N = 7 :
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
Чтобы протестировать свое решение, вы можете запустить его, скажем, 40 000 раз и посмотреть, достаточно ли близко к нему выходное распределение.
Draw all socks. End up with an odd number.