我正在尝试通过将正方形的面积及其嵌入的圆除以估算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=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))
答案 0 :(得分:7)
你有
pigen=inCount/outCount
给出了半径内到外的命中比例。
请注意,pi/(4-pi) = 3.659792...是您的代码当前估计的值。
您需要
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
,可以使用elif
/else
进行简化。由于r
不能大于和小于L
,因此第二个if
可以成为elif
。同样,如果r
不小于或大于L
,则必须相等,因此第三个if
可以简单地成为{{1} }。
else
这将防止在代码中不必要地比较if r<0.5*L:
inCount=inCount+1
elif r>0.5*L:
outCount=outCount+1
else:
inCount=inCount+1
outCount=outCount+1
和r
。
您的最终代码将是
L
答案 1 :(得分:1)
inCount+outCount = 4*r^2
inCount = pi*r^2
因此,如果您需要获取pi
pigen=inCount/(outCount+inCount)*4
答案 2 :(得分:0)
Wai Ha Lee几乎是对的!我也忘记添加4。
如果有人想知道它的运行方式,就是这样(是的,L可以是您想要的任何东西):
import numpy as np
import random as rnd
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=4*inCount/(inCount+outCount)
print('pi generat: '+np.str(pigen))
答案 3 :(得分:0)
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
。