Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取pi估计的错误答案(蒙特卡罗)_Python - Fatal编程技术网

Python 获取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*

我试图用蒙特卡罗模拟来估计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()
随机导入
输入数学
导入系统
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