首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用随机数计算PI

用随机数计算PI
EN

Stack Overflow用户
提问于 2017-10-15 04:32:57
回答 3查看 20.7K关注 0票数 1

在以下问题上有问题:

在几何学中,圆周与其直径之比称为π。π的值可以从以下形式的无限级数中估计:

π/4=1- (1/3) + (1/5) - (1/7) + (1/9) - (1/11) +还有另一种计算π的新方法。想象一下,你有一个省道板,是两个单位的平方。上面刻有一个单位半径的圆圈。圆心与正方形中心重合。现在想象一下,你随机地向飞镖板扔飞镖。那么,圆内飞镖的数量与掷出的飞镖总数的比率与圆面积与方省道板面积之比是相同的。具有单位半径的圆的面积就是π平方单位。省道板的面积为4平方单位。圆面积与正方形面积之比为π/ 4。

为了模拟投掷飞镖,我们将使用一个随机数生成器。所述随机模块具有多个可使用的随机数生成函数。例如,统一函数(a,b)返回a(包括)和b(独占)范围内的浮点随机数。

想象一下,正方形飞镖板上有一个坐标系。右上角有坐标( 1.0,1.0),左下角有坐标( -1.0,-1.0 )。它有两个单位长的边,它的中心(以及内切圆的中心)在原点。

省道板内的随机点可以由x和y坐标指定。这些值是使用随机数生成器生成的。我们实现这一目标的方式是:

代码语言:javascript
运行
复制
xPos = random.uniform (-1.0, 1.0)
yPos = random.uniform (-1.0, 1.0)

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

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

代码语言:javascript
运行
复制
import math
import random

def computePI ( numThrows ):
  ... 

def main ():
  ...

main()

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

代码语言:javascript
运行
复制
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

您的输出必须采用上述格式。抛出的次数必须是正确的。π的计算值和差值必须正确表示为小数点的6位。差额上应该有正负号。阅读书中有关格式化的相关章节。

,直到现在我做了:

代码语言:javascript
运行
复制
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 ()

我在主函数中调用ComputePI函数时遇到了问题。此外,如何打印带左缩进的num,并确保所有数字都有所需的十进制空间?谢谢你!

EN

回答 3

Stack Overflow用户

发布于 2017-10-15 09:22:44

您的程序有三个主要问题:

  1. 在错误的地方生成随机数 xPos = random.uniform (-1.0,1.0) yPos = random.uniform (-1.0,1.0) 当您输入computePI()函数时,这些行只执行一次。然后继续计算hypot的相同值,用于数百次甚至数千次迭代。将这些行放在的these循环中。
  2. 整数算法 pi = (4 * in_circle) / numThrows 因为in_circlenumThrows都是整数,所以这个计算将使用整数算法(至少在Python2中)。将常量从4更改为4.0将更改为浮点计算: pi = (4.0 * in_circle) / numThrows
  3. 不完全main()函数: 不需要使用throws元组的子集,也没有在for循环中添加一个主体。试试这个: 对于numThrows,在(100,1000,10000,100000,1000000,10000000)中: randpi = computePI(numThrows) diff = randpi - math.pi打印"num = %-8d计算的PI = %8.6f差= %+9.6f“%\ (numThrows,randpi,diff)
票数 4
EN

Stack Overflow用户

发布于 2020-05-30 08:23:29

这就是我觉得很简单的方式。

代码语言:javascript
运行
复制
import random
import math
def approximate_pi():
    total_points = 0
    within_circle = 0
    for i in range (10000):
        x = random.random()
        y = random.random()
        total_points += 1
        distance = math.sqrt(x**2+y**2)
        if distance < 1:
            within_circle += 1
        if total_points % 1000 == 0:
            pi_estimate = 4 * within_circle / total_points
            yield pi_estimate

将生成的总点和圆点设置为零。

代码语言:javascript
运行
复制
total_points = 0
within_circle = 0

多次生成x和y的随机值。计算点与圆心或(0,0)之间的距离。如果距离小于1,它意味着它在圆内,所以它是递增的。

代码语言:javascript
运行
复制
distance = math.sqrt(x**2+y**2)
        if distance < 1:
            within_circle += 1

现在,如果您已经生成了1000的倍数(因为我们取了10,000的范围,所以得到了10,000π的值),那么使用这个公式计算pi的估计值,这个公式是already.and绑定的估计值(Pi_estmate)。

代码语言:javascript
运行
复制
if total_points % 1000 == 0:
            pi_estimate = 4 * within_circle / total_points
            yield pi_estimate
代码语言:javascript
运行
复制
pi_estimates = list(es for es in approximate_pi())
errors = list(estimate-math.pi for estimate in approximate_pi())
print(pi_estimates)
print(errors)

输出:

估计

代码语言:javascript
运行
复制
[3.096, 3.142, 3.1253333333333333, 3.121, 3.1384, 3.136, 3.1314285714285712, 3.133, 3.1342222222222222]

误差

代码语言:javascript
运行
复制
[0.04240734641020705, 0.02240734641020703, 0.03307401307687341, 0.020407346410206806, 0.02320734641020694, 0.0017406797435404187, -0.009021225018364554, -0.011592653589793223, -0.016703764700904067]

希望你能理解,我希望我的解释容易理解,我是初学者,如果有什么问题,请随时通知。谢谢

票数 1
EN

Stack Overflow用户

发布于 2020-09-08 11:29:09

从本质上说,你上面写的声明是这样写的:

代码语言:javascript
运行
复制
import math

def find_pi(iterations):
  return sum(
    1 for _ in range(iterations) if math.hypot(
                          random.random(), random.random()) <= 1) * 4.0/iterations
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46751718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档