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

时间:2019-12-29 03:33:16

标签: python math pi

我正在尝试通过将正方形的面积及其嵌入的圆除以估算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))

4 个答案:

答案 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显示正好包含该圆的正方形中的点数,而不显示圆本身。

inCountpi * r**2成正比,而outCountL**2 - pi * r**2 = (4 - pi) * r**2成正比。当您获得比率时,您得到pi / (4 - pi) = 3.66

正如Wai Ha Lee指出的那样,您需要计算4 * inCount / (inCount+outCount) = pi