背景
我收集了“平日袜子”,这是按星期几标记的七双袜子。当我洗袜子时,它们会结成一堆,在将它们放入壁橱之前,我必须将它们整理成正确的对。我的策略是一次从堆中拉出一只随机的袜子,然后放到抽屉里。每当抽屉上有一双相配的袜子时,我就会将它们绑在一起并放在壁橱中。您的任务是模拟此随机过程,并返回找到第一个匹配对所需的抽奖次数。
输入值
您的输入是整数N≥1。它代表“一周中的天数”:一堆中有N对袜子,每对都有一个单独的标签。如有必要,您也可以将PRNG种子用作输入。
输出量
您的输出是找到第一个匹配对之前我必须抽出的袜子数。例如,如果前两个袜子已经形成匹配对,则输出为2
。
当然,输出是随机的,并且取决于绘制顺序。我们假设所有绘制顺序的可能性均等,因此每次绘制袜子时,该选择是统一的,并且独立于所有其他选择。
例
令N = 3,这样我们总共有6只袜子,标记为AABBCC。“袜子绘图协议”的一种可能运行如下:
| Pile | Drawer | Pairs
Begin | AABBCC | - | -
Draw B | AABCC | B | -
Draw C | AABC | BC | -
Draw B | AAC | C | BB
Draw A | AC | AC | BB
Draw A | C | C | AA BB
Draw C | - | - | AA BB CC
在绘制第二个B之后找到第一对匹配项,第二对B是要绘制的第三只袜子,因此正确的输出是3
。
规则和计分
您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。输入和输出可以采用任何合理的格式,包括一元(1
s的字符串)。
您可能会认为您的语言的内置RNG是完美的。只要您的输出具有正确的概率分布,就不必实际模拟袜子绘图协议。
“测试用例”
这是输入N = 7时所有输出的近似概率:
Output 2 3 4 5 6 7 8
Probability 0.077 0.154 0.210 0.224 0.186 0.112 0.037
要测试您的解决方案,可以将其运行例如40 000次,并查看输出分布是否与此相当接近。
Draw all socks. End up with an odd number.