Python 用蒙特卡罗方法估算pi会得到比预期更大的值
我试图通过划分一个正方形和它的嵌入圆的面积来估计π,但是我得到了~3.66 有人知道我做错了什么吗Python 用蒙特卡罗方法估算pi会得到比预期更大的值,python,math,pi,Python,Math,Pi,我试图通过划分一个正方形和它的嵌入圆的面积来估计π,但是我得到了~3.66 有人知道我做错了什么吗 inCount=0 outCount=0 it=1000000 L=100 for i in range(it): xran=rnd.random()*L yran=rnd.random()*L xc=abs(0.5*L-xran) yc=abs(0.5*L-yran) r=np.sqrt((xc**2)+(yc**2)) if r<0.5*L
inCount=0
outCount=0
it=1000000
L=100
for i in range(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
if r<0.5*L:
inCount=inCount+1
if r>0.5*L:
outCount=outCount+1
if r==0.5*L:
inCount=inCount+1
outCount=outCount+1
pigen=inCount/outCount
print('pi generated: '+np.str(pigen))
inCount=0
超出数量=0
它=1000000
L=100
对于范围内的i(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
如果r0.5*L:
超出数量=超出数量+1
如果r==0.5*L:
输入=输入+1
超出数量=超出数量+1
pigen=输入/输出
打印('pi生成:'+np.str(pigen))
您有
pigen=inCount/outCount
它给出了半径内外的命中率
请注意,这是您的代码当前估计的
你需要
pigen=4*inCount/(inCount+outCount)
这将使你的点击率是总点击率的四倍,即pi
还要注意的是,您的代码当前是
if r<0.5*L:
inCount=inCount+1
if r>0.5*L:
outCount=outCount+1
if r==0.5*L:
inCount=inCount+1
outCount=outCount+1
这将防止对代码中的r
和L
进行不必要的比较
您的最终代码将是
inCount=0
outCount=0
it=1000000
L=100
for i in range(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
if r<0.5*L:
inCount=inCount+1
elif r>0.5*L:
outCount=outCount+1
else:
inCount=inCount+1
outCount=outCount+1
pigen=pigen=4*inCount/(inCount+outCount)
print('pi generated: '+np.str(pigen))
inCount=0
超出数量=0
它=1000000
L=100
对于范围内的i(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
如果r0.5*L:
超出数量=超出数量+1
其他:
输入=输入+1
超出数量=超出数量+1
皮根=皮根=4*计入/(计入+超出)
打印('pi生成:'+np.str(pigen))
您有
pigen=inCount/outCount
它给出了半径内外的命中率
请注意,这是您的代码当前估计的
你需要
pigen=4*inCount/(inCount+outCount)
这将使你的点击率是总点击率的四倍,即pi
还要注意的是,您的代码当前是
if r<0.5*L:
inCount=inCount+1
if r>0.5*L:
outCount=outCount+1
if r==0.5*L:
inCount=inCount+1
outCount=outCount+1
这将防止对代码中的r
和L
进行不必要的比较
您的最终代码将是
inCount=0
outCount=0
it=1000000
L=100
for i in range(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
if r<0.5*L:
inCount=inCount+1
elif r>0.5*L:
outCount=outCount+1
else:
inCount=inCount+1
outCount=outCount+1
pigen=pigen=4*inCount/(inCount+outCount)
print('pi generated: '+np.str(pigen))
inCount=0
超出数量=0
它=1000000
L=100
对于范围内的i(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
如果r0.5*L:
超出数量=超出数量+1
其他:
输入=输入+1
超出数量=超出数量+1
皮根=皮根=4*计入/(计入+超出)
打印('pi生成:'+np.str(pigen))
所以如果你需要pi
pigen=inCount/(outCount+inCount)*4
所以如果你需要pi
pigen=inCount/(outCount+inCount)*4
李惠霞几乎是对的!我还忘了加4 如果有人想知道事情是怎么发展的,就是这样(是的,我可以成为你想要的任何人):
将numpy导入为np
作为rnd导入随机数据
inCount=0
超出数量=0
它=1000000
L=100
对于范围内的i(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
如果r0.5*L:
超出数量=超出数量+1
如果r==0.5*L:
输入=输入+1
超出数量=超出数量+1
皮根=4*计入/(计入+超出)
打印('pi generat:'+np.str(pigen))
李惠霞几乎是对的!我还忘了加4
如果有人想知道事情是怎么发展的,就是这样(是的,我可以成为你想要的任何人):
将numpy导入为np
作为rnd导入随机数据
inCount=0
超出数量=0
它=1000000
L=100
对于范围内的i(it):
xran=rnd.random()*L
yran=rnd.random()*L
xc=abs(0.5*L-xran)
yc=abs(0.5*L-yran)
r=np.sqrt((xc**2)+(yc**2))
如果r0.5*L:
超出数量=超出数量+1
如果r==0.5*L:
输入=输入+1
超出数量=超出数量+1
皮根=4*计入/(计入+超出)
打印('pi generat:'+np.str(pigen))
inCount
显示半径圆内的点数r=L/2
和outCount
显示正好包含该圆的正方形中的点数,但不显示圆本身中的点数
inCount
与pi*r**2
成正比,outCount
与L**2-pi*r**2=(4-pi)*r**2
成正比。当你取这个比率时,你会得到pi/(4-pi)=3.66
正如Wai Ha Lee指出的,您需要计算
4*inCount/(inCount+outCount)=pi
inCount
显示半径圆内的点数r=L/2
,outCount
显示正好包含该圆的正方形中的点数,但不显示圆本身中的点数
inCount
与pi*r**2
成正比,outCount
与L**2-pi*r**2=(4-pi)*r**2
成正比。当你取这个比率时,你会得到pi/(4-pi)=3.66
正如Wai Ha Lee指出的,您需要计算
4*inCount/(inCount+outCount)=pi
您可以将导入添加到代码中吗?这可能不起作用,但尝试math.sqrt()
而不是L=100
为什么?你不能用L=1
吗?你能把你的导入添加到代码中吗?这可能不起作用,但是试试math.sqrt()
而不是L=100
为什么?你不能用L=1
?这几乎是对的!我还忘了加一个4。你是说4*
那个吗?啊,是的-在我匆忙中我忘了。这几乎是对的!我还忘了加一个4。你是说4*
那个吗?啊,是的,我匆忙忘了。