我在当地的ACM分会向参加会议的人员颁发奖品。但是,如果您解决了编程难题,您获胜的机会就会增加(但是我总是会解决难题)。因此,有些人只有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 个与小数位高概率。您可能会假设您使用的内置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
是个错误)