硬币抛掷模拟意外概率

时间:2018-04-04 21:01:34

标签: python simulation coin-flipping

这是我编写的一个脚本,用于模拟投币游戏,该游戏以给定的固定结果序列结束(抛出是1或0)。这个固定的序列是游戏的特征。例如,coin_series('01')模拟了一系列投掷,最终导致0后跟1;有效结果为x01,其中x是一串零,而在任何地方都不包含模式01

该脚本给出了终止两个游戏0111所需的投掷次数,这些应该具有相同的结果,因为硬币不是有偏见的(结果为零或结果一折腾。)

然而情况并非如此,我的输出分别为6和4,其中只有第一个是正确的。所以我必须在剧本中有一个错误。

我的问题是:如何使脚本更简洁,因为我希望这有助于找到错误;第二,除了我以外,是否有明显的错误?

import numpy as np
class coin_series(object):
    def __init__(self,win_state):    #win_state is a string of ones and zeroes
        self.win_state=win_state
        self.d=self.draw()
        self.series=[self.d.next() for i in range(len(self.win_state))]
        self.n=len(self.win_state)
        while not self.check():
            self.play()
    def draw(self):
        while True:
            t=np.random.rand()
            if t>=0.5:
                yield 1
            else:
                yield 0
    def check(self):
        return(self.win_state==''.join(map(str,self.series)))
    def play(self):
        self.series=self.series[1:]+[self.d.next()]
        self.n+=1
if __name__=='__main__':
    print np.mean([coin_series('11').n for i in range(100000)])
    print np.mean([coin_series('01').n for i in range(100000)])

2 个答案:

答案 0 :(得分:1)

这不是错误,你的代码工作得很好!

当你掷硬币时,如果你的目标是#Load ntuser.dat reg load HKU\UserProfile C:\users\UserProfile \NTUSER.DAT # Create a new key, close the handle, and trigger collection Set-ItemProperty -Path 'Registry::HKU\UserProfile\Control Panel\Desktop' -Name 'DPIScalingVer' -Value 60 #Unload ntuser.dat reg unload HKU\UserProfile 然后是0并且你1,那么0最终成为另一个1那么你还在那里,你只是希望再次0

另一方面,如果您的目标是1然后1并制作1,那么如果您没有制作第二个{{1}你现在在1并回到等待第一个1

所以要改写另一种方式,在第一种情况下,如果你失败了,你只会中途重置,但在第二种情况下,如果你失败那么你又回到了起点 - 从而增加了平均数量投掷得到他们。

请查看this redit post以获取其他解释。

答案 1 :(得分:1)

没有错误。您需要生成单独的对翻转,以使这些值相等。如果您生成连续的翻转序列并查看重叠对,11平均需要的时间比01要长。