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