我正在尝试使用蒙特卡罗模拟来估计 pi 的值。我需要使用两个单位圆,它们是用户输入到原点的距离。这就是我所拥有的:
import random
import math
import sys
def main():
numDarts=int(sys.argv[1])
distance=float(sys.argv[2])
print(montePi(numDarts,distance))
def montePi(numDarts,distance):
width=2*(1-distance)
if distance>=1:
return(0)
inCircle=0
for i in range(numDarts):
x=(width*(random.random()))-width
y=(random.random())
d=(x-distance)**2+(y-0)**2
d2=(x-(distance*-1))**2+(y-0)**2
if d<=1 and d2>=-1:
inCircle=inCircle+1
pi=(inCircle/numDarts)*(width*2)
return pi
main()
这是我应该得到的-
当距离 = 0 时,大约 3.14 当距离 = 0.5 时,大约 1.288 我分别得到大约 1.6 和 0.6,为什么?
这些是我的指示-
编写一个名为 mcintersection.py 的程序,它使用蒙特卡罗方法来估计这个形状的面积(并打印结果)。你的程序应该有两个命令行参数:distance 和 numDarts。distance 参数指定圆距 x 轴原点的距离。因此,如果距离为 0,则两个圆都以原点为中心,并且完全重叠。如果距离为 0.5,则一个圆以 (-0.5, 0) 为中心,另一个圆以 (0.5, 0) 为中心。如果距离为 1 或更大,则圆圈根本不重叠!在最后一种情况下,您的程序可以简单地输出 0。numDarts 参数应指定在蒙特卡洛过程中选择的随机点数。
在这种情况下,矩形应该是 2 个单位高(顶部在 y = 1 处,底部在 y = -1 处)。您也可以安全地将矩形设为 2 个单位宽,但这通常会比需要的大得多。相反,您应该根据距离参数准确计算形状的宽度。这样你就可以使用尽可能细的矩形。