所以我有A
和B
玩一个游戏,游戏开始于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回答的那样
答案 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
答案 1 :(得分:1)
您的Awin
和Bwin
计算表明,如果A在第5次掷骰中获胜,则由于A掷出3次,B掷出2次,所以A获胜3/5,B获2 / 5。这不是胜利的本意。
此外,您想要random.randrange
,而不是random.randint
,并且将Atoss
和Btoss
初始化放置在循环之前而不是循环内部意味着它们不需要在新的迭代中重置。 (不过,在正确的实现中,抛掷计数是不必要的。)