0

我试图使用 python 计算 200 次抛硬币中最长连续正面连续的预期值。我想出了一个我认为可以完成工作的代码,但由于它需要大量的计算和数据存储,它效率不高,我想知道是否有人可以帮助我解决这个问题,使其更快更高效(上学期我只上了一门 Python 编程课程,之前没有任何相关知识)。

我的代码是

import numpy as np
from itertools import permutations

counter = 0
sett = 0
rle = []

matrix = np.zeros(200)

for i in range (0,200):
    matrix[i] = 1
    for j in permutations(matrix):
        for k in j:
            if k == 1:
               counter += 1
            else:
               if counter > sett:
                  sett == counter
               counter == 0
        rle.append(sett)

找到 rle 后,我将对其进行迭代以获得有多少条长度的条纹,它们的总和除以 2^200 将为我提供我正在寻找的预期值。

在此先感谢您的帮助,非常感谢!

4

2 回答 2

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 模拟的精确计算。

于 2017-02-25T17:54:34.447 回答
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.5, 这是P(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)
于 2017-02-25T17:02:35.413 回答