1

这是我为模拟抛硬币游戏而编写的脚本,该游戏以给定的固定结果序列结束(抛硬币为 1 或 0)。这个固定的顺序是游戏的特征。例如,coin_series('01') 模拟一系列抛掷,最终以 a0后跟 a 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)])
4

2 回答 2

1

这不是错误,您的代码工作正常!

当你抛硬币时,如果你的目标是 a0然后 a1并且你做出了01最终是 another 0,那么你仍然已经到了一半,你只是希望1再次获得 a。

另一方面,如果您的目标是 a 1,然后是 a1并制作1,那么如果您没有制作第二个1,那么您现在处于 a0并返回等待第一个1

所以换一种说法,在第一种情况下,如果你失败了,你只会在中途重置,但在第二种情况下,如果你失败了,那么你会重新开始 - 从而增加平均投掷次数他们。

看看这个 redit 帖子以获得另一种解释。

于 2018-04-04T21:15:06.040 回答
1

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

于 2018-04-04T21:15:29.687 回答