首页 文章

使用随机数计算PI

提问于
浏览
-1

Having trouble with the following question:

在几何形状中,圆周长与其直径的比率称为π . π的值可以从无限系列的形式估计:

π/ 4 = 1 - (1/3)(1/5) - (1/7)(1/9) - (1/11)......还有另一种计算π的新方法 . 想象一下,你有一个2平方的飞镖板 . 它刻有一个单位半径圆 . 圆的中心与正方形的中心重合 . 现在想象你随机地在飞镖板上投掷飞镖 . 然后,落入圆内的飞镖的数量与投掷的总飞镖的数量的比率与圆的面积与方形飞镖的面积的比率相同 . 单位半径的圆的面积仅为π平方单位 . 飞镖盘面积为4平方单位 . 圆的面积与正方形的面积之比为π/ 4 .

为了模拟投掷飞镖我们将使用随机数发生器 . Random模块具有几个可以使用的随机数生成函数 . 例如,函数uniform(a,b)返回a(包括)和b(不包括)范围内的浮点随机数 .

想象一下,方形飞镖盘上有一个坐标系 . 右上角有坐标(1.0,1.0),左下角有坐标(-1.0,-1.0) . 它的边长为2个单位,其中心(以及内切圆的中心)位于原点 .

飞镖板内的随机点可以通过其x和y坐标指定 . 使用随机数生成器生成这些值 . 我们实现这一目标的方式是:

xPos = random.uniform (-1.0, 1.0)
yPos = random.uniform (-1.0, 1.0)

要确定一个点是否在圆内,它与圆心的距离必须严格小于圆的半径 . 坐标(xPos,yPos)与中心的距离是math.hypot(xPos,yPos) . 圆的半径是1个单位 .

您将要编写的程序将被称为CalculatePI . 它将具有以下结构:

import math
import random

def computePI ( numThrows ):
  ... 

def main ():
  ...

main()

函数main()将为给定数量的throws调用函数computePI() . 函数computePI()将通过为x和y坐标生成随机数来模拟dart的投掷 . 您将确定该随机生成的点是否在圆圈内 . 您将按照投掷次数指定的次数执行此操作 . 您将记录飞镖在圆圈内落地的次数 . 该计数除以总投掷数是比率π/ 4 . 然后函数computePI()将返回PI的计算值 . 在您的函数main()中,您想要进行实验,看看PI的准确性是否随着飞镖的投掷次数而增加 . 您将比较结果与math.pi给出的值 . 输出中的数量差异是PI的计算值减去math.pi.使用以下数量的投掷来运行您的实验 - 100,1000,10,000,100,000,1,000,000和10,000,000 . 您将使用这些数字作为输入参数调用函数computePI() . 您的输出将类似于以下内容,即您的计算PI和差异的实际值将不同,但接近显示的值:

Computation of PI using Random Numbers 

num = 100        Calculated PI = 3.320000   Difference = +0.178407 
num = 1000       Calculated PI = 3.080000   Difference = -0.061593 
num = 10000      Calculated PI = 3.120400   Difference = -0.021193 
num = 100000     Calculated PI = 3.144720   Difference = +0.003127 
num = 1000000    Calculated PI = 3.142588   Difference = +0.000995 
num = 10000000   Calculated PI = 3.141796   Difference = +0.000204 

Difference = Calculated PI - math.pi

您的输出必须采用上述格式 . 投掷次数必须左对齐 . 计算出的π值和差值必须正确表示为六位小数 . 差异应该有加号或减号 . 阅读书中有关格式化的相关章节 .

Till now I have done:

import math
import random


def computePI (numThrows):

  xPos = random.uniform (-1.0, 1.0)
  yPos = random.uniform (-1.0, 1.0)

  in_circle = 0
  throws = 0

  while (throws < numThrows):
    if math.hypot (xPos, yPos) <= 1:
      in_circle += 1
    throws += 1
  pi = (4 * in_circle) / numThrows
  return pi


def main ():

  throws = (100, 1000, 10000, 100000, 1000000, 10000000)
  for numThrows in throws[0:7]:

main ()

I am having trouble calling the ComputePI function in the Main function. Also how do I print num with left indentation and ensure that all numbers have the required decimal space? Thank you!

1 回答

  • 3

    您的计划有三个主要问题:

    • 在错误的位置生成随机数
    xPos = random.uniform (-1.0, 1.0)
    yPos = random.uniform (-1.0, 1.0)
    

    当您输入 computePI() 函数时,这些行只执行一次 . 然后,继续计算 hypot 的完全相同的值,进行数百甚至数千次迭代 . 把这些行 inside 放在while循环中 .

    • 整数算术
    pi = (4 * in_circle) / numThrows
    

    由于 in_circlenumThrows 都是整数,因此将使用整数运算执行此计算(至少在Python 2中) . 将常量从 4 更改为 4.0 会将其更改为浮点计算:

    pi = (4.0 * in_circle) / numThrows
    
    • 不完整 main() 功能:

    您无需使用 throws 元组的子集,也没有为 for 循环添加正文 . 试试这个:

    for numThrows in (100, 1000, 10000, 100000, 1000000, 10000000):
        randpi = computePI(numThrows)
        diff = randpi - math.pi
        print "num = %-8d   Calculated PI = %8.6f   Difference = %+9.6f" % \
              (numThrows, randpi, diff)
    

相关问题