模拟2个人扔硬币直到获得第一个头像Python

时间:2019-03-07 00:32:47

标签: python probability

所以我有AB玩一个游戏,游戏开始于A扔硬币。如果显示正面,则A获胜并结束游戏。否则,B投掷,如果B领先,B获胜并结束比赛。基本上,游戏会一直持续到硬币先显示出领先者为止。

从理论上讲,A获胜的概率为2/3,而B获胜的概率为1/3。引用了here

我正在尝试在Python中运行4000模拟。但是,对于2/3我和A 1/3并没有真正接近。下面是我的代码:

B

我在某个地方搞砸了吗?

编辑:

import random Atoss = 0 Btoss = 0 Awins = [] Bwins = [] for i in range(4001): head = False while (not head): A = random.randint(0, 2) # random 0 and 1 Atoss += 1 if A == 1: head = True else: B = random.randint(0, 2) # random 0 and 1 Btoss += 1 if B == 1: head = True totalToss = Atoss + Btoss Awin = Atoss / totalToss Awins.append(Awin) Bwin = Btoss / totalToss Bwins.append(Bwin) probA = sum(Awins) / len(Awins) probB = sum(Bwins) / len(Bwins) print("Probability A: ", probA) print("Probability B: ", probB) 更改为randint(0, 2)可以解决问题,正如@bart cubrich回答的那样

2 个答案:

答案 0 :(得分:2)

您遇到的一个问题是random.randomint应该是

A = random.randint(0, 1)  # random 0 and 1
B = random.randint(0, 1)  # random 0 and 1

您的版本产生的是零,一和二。因为您实际上是在滚动一个3面骰子,且边数= [0,1,2],而只有“ 1”获胜,这完全弄乱了获得正面的机会。尝试以下操作:

import random
random.seed(123)
Atoss = 0
Btoss = 0

Awins = 0
Bwins = 0

for i in range(4000):
   head = False
   while (not head):
      A = random.randint(0, 1)  # random 0 and 1

      if A == 1:
         Awins+=1
         head = True

      else:
         B = random.randint(0, 1)  # random 0 and 1
         if B == 1:
            Bwins+=1
            head = True



probA = Awins / (Awins+Bwins)
probB = Bwins / (Awins+Bwins)

print("Probability A: ", probA)
print("Probability B: ", probB)

Out:
'Probability A:  0.6653336665833541'
'Probability B:  0.3346663334166458'

我得到的概率是〜A:66%B:33%。

注意,在random.py的文档中

random.randint(a,b) -返回一个随机整数N,使a <= N <= b。

与提供的numpy.random.randomint不同

-一个随机整数N,使得a <= N

Documentation is here

答案 1 :(得分:1)

您的AwinBwin计算表明,如果A在第5次掷骰中获胜,则由于A掷出3次,B掷出2次,所以A获胜3/5,B获2 / 5。这不是胜利的本意。

此外,您想要random.randrange,而不是random.randint,并且将AtossBtoss初始化放置在循环之前而不是循环内部意味着它们不需要在新的迭代中重置。 (不过,在正确的实现中,抛掷计数是不必要的。)