由于有几个人要求看数学解法,我将给出解法。这是 Project Euler 问题之一,可以用纸笔在合理的时间内完成。答案是
7(1 - (60 choose 20)/(70 choose 20))
要得到这个结果,将颜色的数量X表示为X0+X1+X2+...+X6的总和,其中Xi表示第i种颜色是否存在,如果存在则为1,否则为0。
E(X)
= E(X0+X1+...+X6)
= E(X0) + E(X1) + ... + E(X6) by linearity of expectation
= 7E(X0) by symmetry
= 7 * probability that a particular color is present
= 7 * (1- probability that a particular color is absent)
= 7 * (1 - (# ways to pick 20 avoiding a color)/(# ways to pick 20))
= 7 * (1 - (60 choose 20)/(70 choose 20))
期望值总是线性的。因此,当您被要求找到某个随机量的平均值时,通常有助于尝试将该量重写为更简单的部分之和,例如指示器(0-1)随机变量。
这并没有说明如何使原作者的方法起作用。虽然有一个直接的数学解决方案,但了解如何有条理、可行地遍历各种情况是很好的。如果您想要更复杂的颜色集合函数而不仅仅是计数,则这可能会有所帮助。Duffymo的答案提出了一些建议,我将其更加明确:
您可以将从70个中抽取20个的方式分成按颜色计数的类别。例如,索引(5,5,10,0,0,0,0)表示我们抽取了第一种颜色的5个,第二种颜色的5个,第三种颜色的10个,而其他颜色则没有抽取到。
可能的索引集包含非负整数7元组和为20的集合。有些是不可能的,比如(11,9,0,0,0,0,0),因为问题假设每种颜色只有10个球,但我们可以解决这个问题。非负数加起来为20的7元组的数量是(26 choose 6) = 230230,并且它与在26个空间中选择6个分隔符或对象的方式有 自然对应。因此,如果你有一种方法可以迭代通过26个元素集的6个元素子集, 那么你可以将它们转换为迭代所有索引。
你仍然需要按照从70个球中抽取20个球的方式计算每种情况的数量来加权。 (a0,a1,a2,...,a6) 的权重为(10 choose a0)
(10 choose a1)...*(10 choose a6)。这样可以优雅地处理不可能的指数情况,因为10 choose 11是0,所以乘积也是0。
因此,如果您不知道通过期望的线性数学解决方案,则可以遍历230230种情况,并计算由小二项式项的乘积加权的指数向量的非零坐标的加权平均值。