这里的 Python 相当新。我正在尝试计算有偏差的抛硬币事件发生的条件概率。除了 if 语句
部分之外,我已经弄清楚了大部分代码 - 具体来说,我不确定是使用 pass
还是 continue
。更具体地说,我希望分母反射(reflect)满足要求的迭代次数,而不是迭代总数。
例如,假设我想计算 6 个组的概率,因为在 10 次抛硬币后我们超过了 5 个组 - 该函数将读取为 simulate_ Three(1000,10,6,5)
,其中参数分别代表 1000 次迭代、10 次抛硬币、6 组和 5 组。假设只有 500 次迭代满足要求 - 因此,结果
的分母是 500,而不是 1000。但是,我不确定代码是否正常工作...
import random
from itertools import groupby
import statistics
# Function for biased coin
def flip(p):
return 'H' if random.random() < p else 'T'
# Simulation
def simulate_three(X, N, Y, Z):
Outcome = [] # List of results
for i in range(X): # For loop for the X number of iterations
flips = [flip(0.6) for j in range(N)] # For loop for N number of coin flips
if len(list(groupby(flips))) <= Z: # If group condition isn't met
pass # Don't store value and skip
Outcome.append(len(list(groupby(flips)))) # Otherwise, store to list
print(sum(Outcome)/(len(Outcome))) # Print expected value
print((Y-(sum(Outcome)/(len(Outcome))))/statistics.stdev(Outcome)) # Print probability
最佳答案
Python 文档有 a great section on control flows.简而言之,pass
充当一种占位符,而 continue
将继续进行下一次迭代。
根据我对您描述的理解,您想要继续
,不通过
。所以正确的版本应该是这样的:
if len(list(groupby(flips))) <= Z:
continue
Outcome.append(len(list(groupby(flips))))
一个更易读、更明确的版本可能是:
if len(list(groupby(flips))) <= Z:
pass
else:
Outcome.append(len(list(groupby(flips))))
当然,最直接的版本可能是:
if len(list(groupby(flips))) > Z:
Outcome.append(len(list(groupby(flips))))
因此,在这种情况下,只有当列表
的长度大于Z
时,它才会被添加到您的结果
中。
您可以通过强制 flip
函数仅返回 H
来测试这一点。如果控制流按预期工作,您将在倒数第二行抛出被零除的错误。
关于Python - For循环和If语句计算抛硬币的概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42061617/