Python 获取pi估计的错误答案(蒙特卡罗)
我试图用蒙特卡罗模拟来估计pi的值。我需要使用两个单位圆,它们是用户输入的距离原点的距离。这就是我所拥有的:Python 获取pi估计的错误答案(蒙特卡罗),python,Python,我试图用蒙特卡罗模拟来估计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*
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()
随机导入
输入数学
导入系统
def main():
numDarts=int(sys.argv[1])
距离=浮动(sys.argv[2])
打印(蒙特皮(numDarts,distance))
def montePi(数值、距离):
宽度=2*(1-距离)
如果距离>=1:
返回(0)
内圆=0
对于范围内的i(numDarts):
x=(宽度*(random.random())-width
y=(random.random())
d=(x距离)**2+(y-0)**2
d2=(x-(距离*-1))**2+(y-0)**2
如果d=-1:
内圆=内圆+1
圆周率=(内圆/数值)*(宽度*2)
返回pi
main()
这是我应该得到的-
当距离=0时,约为3.14
当距离=0.5时,约为1.288
我分别得到1.6和0.6,为什么
这是我的指示-
编写一个名为mcintersection.py的程序,使用蒙特卡罗方法估计此形状的面积(并打印结果)。程序应采用两个命令行参数:距离和numDarts。“距离”参数指定圆与x轴原点的距离。因此,如果距离为0,则两个圆都以原点为中心,并且完全重叠。如果距离为0.5,则一个圆以(-0.5,0)为中心,另一个圆以(0.5,0)为中心。如果距离为1或更大,则圆完全不重叠!在最后一种情况下,您的程序可以简单地输出0。numDarts参数应指定在蒙特卡罗过程中拾取的随机点的数量
在这种情况下,矩形的高度应为2个单位(顶部为y=1,底部为y=-1)。您也可以安全地将矩形设置为2个单位宽,但这通常会比需要的大得多。相反,您应该根据“距离”参数精确计算形状的宽度。这样,您就可以使用尽可能薄的矩形。请注意,您的结果几乎是应该的一半 如果您尝试打印出距离0的省道位置,那么问题出现的地方应该很明显:
x
值都是负值,它们低至-2,而很明显它们应该在-1到1的范围内。所以,你得到的点击率只有你应该得到的一半。其他距离的问题也一样——不太明显,但足够明显,类似的东西是错误的
因此,请查看每个x
的公式:
x=(width*(random.random()))-width
width*(random.random())
提供从0到宽度的随机数。减去width
会得到一个从-width到0的随机数
现在,解决办法应该是显而易见的:
x=(width*(random.random()))-width/2
同时,
d2
始终为正,因为它是两个平方的和,所以d2>=-1
始终为真。您想检查d2请注意,您的结果几乎是其应有结果的一半
如果您尝试打印出距离0的省道位置,那么问题出现的地方应该很明显:x
值都是负值,它们低至-2,而很明显它们应该在-1到1的范围内。所以,你得到的点击率只有你应该得到的一半。其他距离的问题也一样——不太明显,但足够明显,类似的东西是错误的
因此,请查看每个x
的公式:
x=(width*(random.random()))-width
width*(random.random())
提供从0到宽度的随机数。减去width
会得到一个从-width到0的随机数
现在,解决办法应该是显而易见的:
x=(width*(random.random()))-width/2
同时,d2
始终为正,因为它是两个平方的和,所以d2>=-1
始终为真。你想检查的不是距离,而是一些重要的方面……否则,你为什么要问?那么,你在测试什么样的价值观呢?@Legostrmtroopr:不,他不是,他是在要求我们帮助他做作业,在他尝试了很长一段时间后,但后来被卡住了,这是完全正确的。(只要他的老师不介意。)这个问题肯定可以改进,但不应该关闭(除非他拒绝改进)。提示:d2>=-1
总是正确的。为什么?因为d2
是两个平方的和。正方形总是非负的。因此,事实上,d2>=0
总是正确的。查找错误;-)对不起,我是新来的,我真的不知道我做错了什么。我只用了1000个飞镖,因为这并不能改变答案。如果我的问题不好,我很抱歉,我的老师不是最有帮助的,而且在课堂上动作非常快:(您使用的Python版本是什么?如果是2.7或更低版本,则incercle/numDarts
始终为0,因为它们都是整数。如果是3.0或更高版本,这不是问题。可能numDarts很重要,而不仅仅是距离……否则,您为什么会要求它?那么,您测试的值是什么?@legostrmpr:不,他不是,他要求我们帮助他做家庭作业,在他尝试了很长一段时间后,但后来被卡住了,这是完全正确的。(只要他的老师不介意。)这个问题肯定可以改进,但不应该关闭(除非他拒绝改进).提示:d2>=-1
始终为真。为什么?因为d2
是两个平方的和。平方总是非负的。因此,事实上,d2>=0
始终为真。查找错误;-)对不起,我是新来的,我真的不知道我做错了什么。我只是使用1000个省道,因为这并不能真正改变答案。如果我的问题不好,我很抱歉,我的老师不是最有帮助的,而且在课堂上动作非常快:(你使用的是什么版本的Python?如果是2