【问题标题】:Longest expected head streak in 200 coinflips200 次硬币翻转中最长的预期头连续
【发布时间】:2017-02-26 02:27:28
【问题描述】:

我试图使用 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 将给出我正在寻找的预期值。

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

【问题讨论】:

  • 你有 200 个! (几乎 8e374) 排列每个矩阵,所以你的一生都不足以尝试所有这些。你最好尝试一种完全不同的方法!
  • 最长连胜的期望值是指您获得的最可能的连续正面数吗?
  • 我仍然看不出我的答案有什么问题,但我会阅读它。现在我已经删除了我的答案。
  • 我想我搞错了。我正在完全解决一个不同的问题。

标签: python python-2.7 mean coin-flipping


【解决方案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

另请参阅this thread 了解不使用 Python 模拟的精确计算。

【讨论】:

    【解决方案2】:

    这是对一个略有不同的问题的回答。但是,由于我已经投入了一个半小时的时间,我不想把它刮掉。

    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)
    

    【讨论】:

    • 我认为您误解了这个问题。 OP 正在寻找最长条纹长度的expected value
    • 期望值不是指概率最大的那个吗? @das-g
    • 不,不是统计中概率最大的值,这是一个固定术语,指的是无限期重复随机实验时的平均值。
    • 我不确定这到底是在回答什么问题,但我很确定在 200 次抛硬币中最大连续头部长度的期望值大于 1..跨度>
    • 不会考虑理想情况给出最接近的结果吗?我假设这个事件是理想的,即如果硬币被抛 200 次,所有2**200 的可能性都会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    • 2018-12-30
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多