Mi capítulo local de ACM otorga premios a las personas que vienen a las reuniones. Sin embargo, tienes una mayor probabilidad de ganar si resuelves el rompecabezas de programación (pero yo siempre resuelvo ese rompecabezas). Por lo tanto, algunas personas tienen 1 entrada, mientras que otras tienen 2. ¡Pero espera! La forma en que funciona el programa de rifa no es agregando otra entrada cuando alguien resuelve el rompecabezas. En cambio, realiza un seguimiento del número de "vidas" que tiene una persona, decrementando que si esa persona es elegida en cada pasada de su algoritmo de muestreo aleatorio. Entonces funciona así:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
Luego, el programa elige aleatoriamente uno de [Doorknob, xnor, Justin, Alex, Dennis]
, disminuye el número (digamos que elige Justin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
Y se repite. Si el número de "vidas" de alguien va a 0
(volvamos a elegir Justin
), se eliminan de la lista:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
Esto continúa hasta que quede una persona; esa persona es la ganadora.
Ahora la verdadera pregunta es, ¿cuál era la probabilidad de que hubiera ganado?
Se le darán dos entradas:
n
. Este es el número de personas que participaron en el desafío.k
. Este es el número de personas (de esasn
) que tienen 2 vidas. Este número siempre te incluye a ti.
Entonces, si tuviera una función p
y llamara p(10, 5)
, esa sería la probabilidad de ganar el premio donde hay un total de 10 personas, 5 de las cuales solo tienen 1 vida, mientras que 5 (incluido usted) tienen 2 vidas.
Se espera que muestre la probabilidad de ganar, ya sea exactamente, o como un decimal. En cualquier caso, las respuestas deben ser precisas hasta el 4 ° lugar decimal después del punto decimal. Si redondeas a ese dígito o no, depende de ti.
Su solución puede ser una solución aleatorizado que emite la respuesta a la 4 ª posición decimal con alta probabilidad . Puede suponer que el RNG incorporado que utiliza es verdaderamente aleatorio y debe generar la respuesta correcta con al menos un 90% de probabilidad.
Además, su código solo necesita funcionar n, k <= 1000
, aunque proporcioné casos de prueba más grandes que eso para aquellos curiosos.
Casos de prueba
Nota: algunos de estos son fórmulas generales.
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
Para otras verificaciones, tome p(n, 1) * n
lo siguiente:
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
está desactivada por uno)