Python 用蒙特卡罗方法估算pi会得到比预期更大的值

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

我试图通过划分一个正方形和它的嵌入圆的面积来估计π,但是我得到了~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=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*
那个吗?啊,是的,我匆忙忘了。