【发布时间】:2021-03-25 17:25:19
【问题描述】:
提前感谢您的帮助。
我用python写了一个概率计算器。我要计算的概率是:当你尝试 6 次获胜机会为 1% 的游戏时,获胜的概率是多少。所以下面这段代码就是我写的。
import random as rand
total = 0
count = 0
p = pSum = 0
k = 6
n = 10000
m = 100
def pick(attemptPerIteration):
global total, count
for _ in range(attemptPerIteration):
temp = rand.randint(1, 100)
if (temp == 1):
count += 1
total += 1
return 0
return 1
for t in range(m):
for u in range(n):
total += pick(k)
p = count / total
print(str(t + 1) + ": " + str(p * 100))
pSum += p
p = 0
print(pSum / m * 100)
在这段代码中,我使用了 randint 函数来模拟 100 分之一的机会。我预期的概率约为 5.8%,但该程序的输出约为 6.3%。但是如果我只使用 randint(1, 1000) % 6 + 1 insted randint(1, 6),程序会告诉我概率是 5.8,这是我的预期。
这个 randint 函数到底发生了什么?为什么旧的 % 技巧有效,而 randint 无效?
这个问题的数学公式是这样的:
【问题讨论】:
-
因为
randint(a,b)返回的数字从a包含到b不包含。 -
@CaptainTrojan 请参阅doc python 的 randint 包括两端。这是 Numpy 的 randint,不包括
b。 -
顺便说一句,我认为
1-(1-0.01)^6是对获胜机会的更简洁定义。 -
首先,感谢您的帮助。我真是个白痴!当 temp == 1 时,我不应该计算总数,因为我想要的概率不是在总尝试中出现多少 1,而是在每场比赛中出现 1。所以,我应该删除那部分。而且我什至没有在每次尝试结束时重置 count var。另外,我可以只使用 n 进行总尝试; var total 实际上根本没有必要!结论:randint 函数完全可以解决这个问题,这是人为错误 lol
-
注意:您应该期望在 95% 的时间内获得 [5.4%, 6.32%] 范围内的结果。您可以使用
scipy.stats.binom.ppf([0.025, 0.975], n, 1-0.99**6) / n计算此值。尝试更改n以查看置信区间如何变化
标签: python random probability modulo