最长的预期头条连续200个硬币翻转

时间:2017-02-25 16:31:39

标签: python python-2.7 mean coin-flipping

我试图使用python计算200次硬币翻转中最长连续头条纹的预期值。我提出了一个代码,我认为这项工作是正确的,但由于它需要大量的计算和数据存储而无法提高效率,而且我想知道是否有人可以帮我解决这个问题,让它变得更快并且效率更高(我在上学期只参加过一门python编程课程而没有任何关于该主题的知识)。

我的代码是

Emily

找到rle之后,我会迭代它以获得有多少条纹的长度,它们的总和除以2 ^ 200就会得到我想要的预期值。

提前感谢您的帮助,非常感谢!

2 个答案:

答案 0 :(得分:1)

您不必尝试所有排列(事实上您不能),但您可以进行简单的蒙特卡罗风格模拟。重复200次硬币翻转多次。平均你得到的最长条纹的长度,这将是预期值的良好近似值。

def oneTrial (noOfCoinFlips):
    s = numpy.random.binomial(1, 0.5, noOfCoinFlips)
    maxCount = 0
    count = 0
    for x in s:
        if x == 1:
            count += 1
        if x == 0:
            count = 0
        maxCount = max(maxCount, count)
    return maxCount


numpy.mean([oneTrial(200) for x in range(10000)])

Output: 6.9843

如果不使用Python模拟,请参阅this thread以获得精确计算。

答案 1 :(得分:0)

这是一个稍微不同的问题的答案。但是,由于我花了一个半小时的时间投入其中,我并不想把它刮掉。

E(k)表示k头条纹,即从第一次折腾后获得k个连续头部

E(0): T { another 199 tosses that we do not care about }
E(1): H T { another 198 tosses... }
.
.
E(198): { 198 heads } T H
E(199): { 199 heads } T
E(200): { 200 heads }

请注意P(0) = 0.5P(tails in first toss)P(1) = 0.25,即P(heads in first toss and tails in the second)

P(0) = 2**-1
P(1) = 2**-2
.
.
.
P(198) = 2**-199
P(199) = 2**-200
P(200) = 2**-200    #same as P(199)

这意味着如果你掷硬币2**200次,你就会

E(0) 2**199 times
E(1) 2**198 times
.
.
E(198) 2**1 times
E(199) 2**0 times and
E(200) 2**0 times.

因此,预期值减少到

(0*(2**199) + 1*(2**198) + 2*(2**197) + ... + 198*(2**1) + 199*(2**0) + 200*(2**0))/2**200

这个数字实际上等于1。

Expected_value = 1 - 2**-200

我是如何得到的。

>>> diff = 2**200 - sum([ k*(2**(199-k)) for k in range(200)], 200*(2**0))
>>> diff
1

这可以推广为n投掷

f(n) = 1 - 2**(-n)