Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 投币模拟意外概率_Python_Simulation_Coin Flipping - Fatal编程技术网

Python 投币模拟意外概率

Python 投币模拟意外概率,python,simulation,coin-flipping,Python,Simulation,Coin Flipping,这是我写的一个脚本,用来模拟一个掷硬币游戏,游戏以给定的固定结果序列结束(掷硬币不是一就是零)。这种固定的顺序是游戏的特点。例如,coin_series('01')模拟了一系列抛投,最终掷出0,然后掷出1;有效的结果是x01,其中x是一个由零和不包含模式01的字符串 脚本给出了终止两个游戏所需的掷骰次数,01和11,这些掷骰的结果应该相同,因为硬币不是有偏的(掷骰时结果为零或结果为一的机会相等) 但事实并非如此,我的输出分别为6和4,其中只有第一个是正确的。所以我的脚本中一定有一个bug 我的问

这是我写的一个脚本,用来模拟一个掷硬币游戏,游戏以给定的固定结果序列结束(掷硬币不是一就是零)。这种固定的顺序是游戏的特点。例如,
coin_series('01'
)模拟了一系列抛投,最终掷出
0
,然后掷出
1
;有效的结果是
x01
,其中
x
是一个由零和不包含模式
01
的字符串

脚本给出了终止两个游戏所需的掷骰次数,
01
11
,这些掷骰的结果应该相同,因为硬币不是有偏的(掷骰时结果为零或结果为一的机会相等)

但事实并非如此,我的输出分别为6和4,其中只有第一个是正确的。所以我的脚本中一定有一个bug

我的问题是:如何使脚本更加简洁,因为我希望这将有助于找到bug;第二,除了我之外,有没有其他人都能看到的bug

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)])

这不是bug,你的代码运行得很好

当你掷硬币时,如果你的目标是
0
,然后是
1
,你把
0
变成了
1
,但是
1
最后变成了另一个
0
,那么你已经走到了一半,你只是希望再次得到
1

另一方面,如果你的目标是
1
,然后是
1
,然后是
1
,如果你没有做第二个
1
,那么你现在是
0
,然后回到等待第一个
1

因此,以另一种方式改写,在第一种情况下,如果你失败了,你只重置了一半,但在第二种情况下,如果你失败了,你又回到了起点-从而增加了获得它们的平均投掷次数


请看另一个解释。

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

花费更长的时间来显示链接,为什么要编辑链接?现在你告诉人们不要看任何东西。@user2357112对不起!我在写解释的时候编辑错了!这回答了我的问题。我对这个游戏的理解不够。非常感谢你。我发现这个链接很有用,但也许你的解释不需要阅读它。协议现在是否将此标记为答案?是!单击答案旁边的灰色勾号,它将变为绿色,表示未来的访问者认为这对您有用(因此也可能对他们有用!)谢谢。任何关于使脚本更符合最佳实践的评论也将非常有用!谢谢你,看上面,你让我对游戏更清楚了。我想将此标记为一个答案,但不知道如何标记。如果我遗漏了什么,或者这个评论结束了问题,请告诉我。再次感谢!顺便说一句,如果你有一个两人游戏,其中一个玩家赢了,如果他们的顺序先出现,谁有优势比谁的顺序平均需要更长的时间来出现更复杂。