Il mio capitolo ACM locale consegna premi alle persone che partecipano alle riunioni. Tuttavia, avrai maggiori possibilità di vincere se risolvi il puzzle di programmazione (ma io risolvo sempre quel puzzle). Quindi, alcune persone hanno 1 voce, mentre altre ne hanno 2. Ma aspetta! Il modo in cui funziona il programma della lotteria non è aggiungendo un'altra voce quando qualcuno risolve il puzzle. Invece, tiene traccia del numero di "vite" che una persona ha, diminuendo che se quella persona viene scelta in ogni passaggio del suo algoritmo di campionamento casuale. Quindi funziona così:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
Quindi il programma sceglie casualmente uno dei [Doorknob, xnor, Justin, Alex, Dennis]
, diminuisce il numero (diciamo che sceglie Justin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
E si ripete. Se il numero di "vite" di qualcuno va a 0
(scegliamo di Justin
nuovo), vengono rimossi dall'elenco:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
Questo continua fino a quando rimane una persona; quella persona è il vincitore.
Ora la vera domanda è: qual è stata la probabilità che avrei vinto?
Ti verranno dati due input:
n
. Questo è il numero di persone iscritte alla sfidak
. Questo è il numero di persone (di quellen
) che hanno 2 vite. Questo numero include sempre te.
Quindi, se avessi una funzione p
e chiamassi p(10, 5)
, sarebbe la probabilità di vincere il premio dove ci sono 10 persone in totale, 5 delle quali hanno solo 1 punto vita, mentre 5 (incluso te) hanno 2 punti vita.
Ci si aspetta che produca la probabilità di vincere esattamente o come un decimale. Ad ogni modo, le risposte devono essere accurate fino al 4 ° decimale incluso dopo il punto decimale. Che tu debba arrotondare a quella cifra dipende da te.
La tua soluzione può essere una soluzione randomizzata che genera la risposta al 4 ° decimale con alta probabilità . Si può presumere che l'RNG incorporato che si utilizza sia veramente casuale e che debba generare la risposta corretta con almeno il 90% di probabilità.
Inoltre, il tuo codice deve funzionare solo per n, k <= 1000
, anche se ho fornito casi di test più grandi di quello per i curiosi.
Casi test
Nota: alcune di queste sono formule generali.
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
Per altri controlli, prendere p(n, 1) * n
come segue:
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
sia disattivata da uno)