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

理论上,A获胜的概率为2/3,而B获胜的概率为1/3。 这里引用

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


33import 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)

我在某个地方搞砸了吗?

编辑:

@bart cubrich回答,将randint(0, 2)更改为randint(0, 1)可解决此问题。

您的Awin / Bwin / Awins / Bwins计算看起来并不像如何定义游戏的胜利。

是的,我认为进行抛掷/总抛掷是不正确的,但是我无法弄清楚如何像在纸上一样对它进行"编码"

主要错误是此代码是一个错字,所以也许值得一票,但它是一个很酷的问题,通常我喜欢您的解决方案。 另外,您提前意识到了这可能是一个错误。 绝对不需要跟踪投掷的次数,但是有趣的是要查看循环需要多少投掷。

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

1

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

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

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

34import 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

文档在这里

非常感谢您的反馈,答案以及对我的评价:)关于我写randint(0,2),这实际上是故意的,因为我认为randint(a, b)的工作方式是它将为您提供范围为到b - 1,所以我将2放在这里。显然我错了。但是还是非常感谢您!

是的,请记住在调试时使用简单的步骤。我尝试使用不同的规则来运行您的游戏。我跑了一个例子,如果A不甩头B就赢了。那应该有50/50的几率,但没有,这就是当我看到random.randint(0,2)的问题。另外,使用新的库和方法时,请务必阅读文档。另外,当您将range(4001)设置为range(4000)时,请确保了解range的工作原理。我喜欢像anaconda / spyder一样使用和IDE,因此我可以轻松查看变量内部。令人困惑的是,numpys random.randomint()的工作原理与您一样。

您的Awin和Bwin计算表明,如果A在第5次掷骰中获胜,则由于A掷3次,B掷2次,所以A获胜3/5,B获2/5。这不是胜利应该发挥作用的方式。

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

是的,我确实觉得获得获胜的可能性非常容易,但我无法将头围住,并且进行#次抛掷/总抛掷似乎不正确。您能在这里给我一些指导吗?