Meu capítulo local da ACM oferece prêmios para as pessoas que comparecem às reuniões. Você tem uma chance maior de ganhar se resolver o quebra-cabeça de programação, no entanto (mas eu sempre resolvo esse quebra-cabeça). Assim, algumas pessoas têm 1 entrada, enquanto outras têm 2. Mas espere! A maneira como o programa de sorteio funciona não é adicionando outra entrada quando alguém resolve o quebra-cabeça. Em vez disso, ele controla o número de "vidas" que uma pessoa tem, diminuindo que, se essa pessoa for escolhida em cada passagem do seu algoritmo de amostragem aleatória. Então, funciona assim:
Doorknob: 1. xnor: 2. Justin: 2. Alex: 1. Dennis: 2.
Em seguida, o programa escolhe aleatoriamente um dos [Doorknob, xnor, Justin, Alex, Dennis]
, diminui o número (diga que ele escolhe Justin
):
Doorknob: 1. xnor: 2. Justin: 1. Alex: 1. Dennis: 2.
E repete. Se o número de "vidas" de alguém for para 0
(vamos escolher Justin
novamente), eles serão removidos da lista:
Doorknob: 1. xnor: 2. Alex: 1. Dennis: 2.
Isso continua até que haja uma pessoa; essa pessoa é a vencedora.
Agora, a verdadeira questão é: qual era a probabilidade de ganhar?
Você receberá duas entradas:
n
. Este é o número de pessoas que participaram do desafiok
. Este é o número de pessoas (daquelasn
) que têm 2 vidas. Esse número sempre inclui você.
Então, se eu tivesse uma função p
e telefonasse p(10, 5)
, essa seria a probabilidade de ganhar o prêmio onde há 10 pessoas no total, 5 das quais têm apenas 1 vida, enquanto 5 (incluindo você) têm 2 vidas.
Espera-se que você produza a probabilidade de ganhar exatamente ou como um decimal. De qualquer forma, as respostas devem ser até precisos e incluindo a 4 ª casa decimal depois do ponto decimal. Você deve ou não arredondar para esse dígito.
Sua solução pode ser uma solução randomizado que gera a resposta para a 4 ª casa decimal com alta probabilidade . Você pode supor que o RNG incorporado que você usa é verdadeiramente aleatório e deve gerar a resposta correta com pelo menos 90% de probabilidade.
Além disso, seu código precisa apenas funcionar n, k <= 1000
, embora eu tenha fornecido casos de teste maiores que os para aqueles curiosos.
Casos de teste
Nota: algumas dessas são fórmulas gerais.
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 mais algumas verificações, faça p(n, 1) * n
o seguinte:
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á fora por um)