Mein lokales ACM-Kapitel verteilt Türpreise an Leute, die zu den Meetings kommen. Sie haben jedoch eine erhöhte Gewinnchance, wenn Sie das Programmierpuzzle lösen (aber ich löse das Puzzle immer). So haben einige Leute 1 Eintrag, während andere 2 haben. Aber warte! Die Art und Weise, wie das Gewinnspiel funktioniert, besteht nicht darin, einen anderen Eintrag hinzuzufügen, wenn jemand das Rätsel löst. Stattdessen wird die Anzahl der "Leben" einer Person protokolliert, wobei dekrementiert wird, ob diese Person in jedem Durchgang ihres Zufallsstichprobenalgorithmus ausgewählt wird. So funktioniert es also:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
Dann wählt das Programm nach dem Zufallsprinzip eine der folgenden [Doorknob, xnor, Justin, Alex, Dennis]
Optionen, dekrementiert die Zahl (sagt, es wählt Justin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
Und wiederholt. Wenn die Anzahl der "Leben" von jemandem auf "geht" 0
( Justin
erneut auswählen ), werden sie aus der Liste entfernt:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
Dies geht so lange weiter, bis eine Person übrig ist. Diese Person ist der Gewinner.
Die eigentliche Frage ist nun, mit welcher Wahrscheinlichkeit ich gewonnen hätte.
Sie erhalten zwei Eingaben:
n
. Dies ist die Anzahl der Personen, die an der Herausforderung teilgenommen habenk
. Dies ist die Anzahl der Personen (von denenn
), die 2 Leben haben. Diese Nummer enthält immer Sie.
Wenn ich also eine Funktion hätte p
und anrufe p(10, 5)
, wäre das die Wahrscheinlichkeit, den Preis zu gewinnen, wenn insgesamt 10 Personen anwesend sind, von denen 5 nur 1 Leben haben, während 5 (einschließlich Sie) 2 Leben haben.
Es wird erwartet, dass Sie die Gewinnwahrscheinlichkeit entweder genau oder als Dezimalzahl ausgeben. Auf jeden Fall Antworten müssen genau bis zu und einschließlich der 4 - te Dezimalstelle hinter dem Komma. Es liegt an Ihnen, ob Sie auf diese Ziffer runden oder nicht.
Ihre Lösung kann eine randomisierte Lösung sein , die gibt die Antwort auf die 4 - te Dezimalstelle mit hohen Wahrscheinlichkeit . Sie können davon ausgehen, dass das von Ihnen verwendete integrierte RNG wirklich zufällig ist und die richtige Antwort mit einer Wahrscheinlichkeit von mindestens 90% ausgegeben werden muss.
Außerdem muss Ihr Code nur für funktionieren n, k <= 1000
, obwohl ich Testfälle bereitgestellt habe, die für Neugierige größer sind.
Testfälle
Hinweis: Einige davon sind allgemeine Formeln.
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
Für weitere Überprüfungen p(n, 1) * n
wie folgt vorgehen:
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
ist eins)