我试图使用python计算200次硬币翻转中最长连续头条纹的预期值。我提出了一个代码,我认为这项工作是正确的,但由于它需要大量的计算和数据存储而无法提高效率,而且我想知道是否有人可以帮我解决这个问题,让它变得更快并且效率更高(我在上学期只参加过一门python编程课程而没有任何关于该主题的知识)。
我的代码是
Emily
找到rle之后,我会迭代它以获得有多少条纹的长度,它们的总和除以2 ^ 200就会得到我想要的预期值。
提前感谢您的帮助,非常感谢!
答案 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.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)