Мій місцевий глава ОСБ роздає призові двері людям, які приходять на збори. Однак ви отримуєте підвищений шанс виграти, якщо вирішите загадку програмування (але я завжди вирішую цю головоломку). Таким чином, деякі люди мають 1 запис, а інші - 2. Але зачекайте! Те, як працює програма розіграшу, полягає не в тому, щоб додати в інший запис, коли хтось вирішить пазл. Натомість він відслідковує кількість "життів" людини, декрементуючи, що якщо цю особу обирають при кожному пропуску, це алгоритм випадкового відбору. Так воно працює так:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
Тоді програма випадковим чином вибирає один із [Doorknob, xnor, Justin, Alex, Dennis]
, зменшує число (скажімо, що вибирає Justin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
І повторюється. Якщо чиєсь число "життів" переходить 0
(давайте вибираємо Justin
ще раз), вони видаляються зі списку:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
Це триває, поки не залишиться одна людина; ця людина є переможцем.
Тепер справжнє питання полягає в тому, якою була ймовірність того, що я виграю?
Вам будуть надані два входи:
n
. Це кількість людей, які взяли участь у викликуk
. Це кількість людей (тихn
), які мають 2 життя. Цей номер завжди включає вас.
Тож якби я функціонував p
і зателефонував p(10, 5)
, це була б ймовірність виграти приз, де всього 10 людей, 5 з яких мають лише 1 життя, тоді як 5 (включаючи вас) мають 2 життя.
Очікується, що ви отримаєте ймовірність виграти або точно, або у вигляді десятків. У будь-якому випадку відповіді повинні бути точними до 4- го числа після коми після коми. Незалежно від того, чи будете ви обрати цю цифру, чи ні.
Ваше рішення може бути рандомизованим рішенням, яке виводить відповідь на 4- й десятковий знак з високою ймовірністю . Ви можете припустити, що вбудований RNG, який ви використовуєте, є справді випадковим, і він повинен виводити правильну відповідь принаймні на 90%.
Крім того, ваш код потребує лише роботи n, k <= 1000
, хоча я надавав тестові випадки, більші, ніж ті, хто цікавиться.
Випробування
Примітка: деякі з них є загальними формулами.
n, k | output
----------+---------
1, 1 | 1
2, 2 | 0.5
2, 1 | 0.75
3, 1 | 11/18 = 0.611111111
1000, 1 | 0.007485470860550352
4, 3 | 0.3052662037037037
k, k | 1/k
n, 1 | (EulerGamma + PolyGamma[1 + n])/n (* Mathematica code *)
| (γ + ψ(1 + n))/n
10, 6 | 0.14424629234373537
300, 100 | 0.007871966408910648
500, 200 | 0.004218184180294532
1000, 500 | 0.0018008560286627948
---------------------------------- Extra (not needed to be a valid answer)
5000, 601 | 0.0009518052922680399
5000, 901 | 0.0007632938197806958
Для ще кількох перевірок зробіть p(n, 1) * n
наступне:
n | output
------+---------
1 | 1
2 | 1.5
3 | 1.8333333333333335
10 | 2.928968253968254
100 | 5.1873775176396215
-------------------------- Extra (not needed to be a valid answer)
100000| 12.090146129863305
k
, вимкнений одним)