python中的硬币翻转模拟
我想模拟一枚硬币翻转500次。然后,我必须创建一个图表,显示在x轴上翻转硬币时,硬币头部的运行比例,在y轴上显示头部的比例。我编写了Python代码,出现了以下错误:python中的硬币翻转模拟,python,simulate,coin-flipping,Python,Simulate,Coin Flipping,我想模拟一枚硬币翻转500次。然后,我必须创建一个图表,显示在x轴上翻转硬币时,硬币头部的运行比例,在y轴上显示头部的比例。我编写了Python代码,出现了以下错误: Traceback (most recent call last): File "E:\ProgramsPython\My\bayes\Coin Flip.py", line 22, in <module> ylist = [coinFlip(x) for x in xlist] File "E:\ProgramsPy
Traceback (most recent call last):
File "E:\ProgramsPython\My\bayes\Coin Flip.py", line 22, in <module>
ylist = [coinFlip(x) for x in xlist]
File "E:\ProgramsPython\My\bayes\Coin Flip.py", line 16, in coinFlip
return heads / x
ZeroDivisionError: integer division or modulo by zero
这个错误是说你被零除了。所以有一条线,你可以分开,它可能在那里 在我看来,尝试将您的回报率改为这一点更有意义:
return heads / size
x可以等于零。当这种情况发生时,特别是调用coinFlip1时
heads / x
引发零错误
顺便说一下,因为您使用的是matplotlib,所以必须安装NumPy。因此,您可以这样使用express coinFlip:
import matplotlib.pyplot as plt
import numpy as np
def coinFlip(size):
flips = np.random.randint(0, 2, size=size)
return flips.mean()
coinFlip = np.frompyfunc(coinFlip, 1, 1)
xmin, xmax, dx = 1, 500, 1
x = np.arange(xmin, xmax, dx)
y = coinFlip(x)
plt.plot(x, y)
plt.show()
或者使用@pjs的评论,查看在一次500次硬币投掷中头部的比例是如何变化的:
def coinFlip(size):
xmin, xmax, dx = 1, size, 1
x = np.arange(xmin, xmax, dx)
flips = np.random.randint(0, 2, size=size)
return x, [flips[:i].mean() for i in x]
x, y = coinFlip(500)
plt.plot(x, y)
要在对数刻度上绘制x轴,请执行以下操作:
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xscale('log')
你需要按大小划分头部
为了避免截断,它可能应该是
return heads / float(size)
排队的时候
返回头/x
最后一次运行时,x为0,因此创建了零除错误。如果这样做,请不要忘记确保大小不是0。根据OP代码的其余部分,大小不会是0,而是介于1和500之间。但是,除了所有关于除以零的反馈之外,执行某种检查可能是一种很好的做法,我不确定你是否在做要求你做的事情。当你运行这个程序时,它将根据不同的样本大小绘制500个独立的采样结果。在一个500次抛硬币的实验中,运行比例应该绘制出每次额外抛硬币的比例变化。谢谢,这是我真正想要的。还有一个问题,我如何在对数尺度上绘制x轴,这样我就可以看到前几次翻转的细节,以及多次翻转后的长期趋势?
import numpy as np
from matplotlib import pyplot as plt
flips = np.random.binomial(1, 0.5, 500) # flip 1 coin with 0.5 prob of heads 500 times
heads_so_far = flips.cumsum() * 1.0 #lets use float to avoid truncations later
heads_to_count = [heads_so_far[i-1]/i for i in range(1,len(flips)+1)]
x = range(1,len(flips)+1)
plt.plot(x,heads_to_count)
plt.show()
return heads / float(size)
import numpy as np
from matplotlib import pyplot as plt
flips = np.random.binomial(1, 0.5, 500) # flip 1 coin with 0.5 prob of heads 500 times
heads_so_far = flips.cumsum() * 1.0 #lets use float to avoid truncations later
heads_to_count = [heads_so_far[i-1]/i for i in range(1,len(flips)+1)]
x = range(1,len(flips)+1)
plt.plot(x,heads_to_count)
plt.show()