Fork me on GitHub

利用python求 $\pi$ 的近似值

这是第一篇关于python的博客,看大家都在学习新的语言,忍不住学一发python,东西太过简单大佬就不要嘲笑我了。

$\pi$ 的计算是没有一个准确的公式可以将它计算出来的,为了求出它,我们只能利用模拟的方法近似求出 $\pi$ 的值。

利用python计算 $\pi$ 的近似值的方法采用的是蒙特卡洛方法,这种方法利用的是随机抽样或统计的实验方法。

它其实就是一种模拟的思想。。。

首先构造一个单位正方形和 $\frac14$ 圆。

然后随机的向单位正方形抛洒大量的点,对于每个点,可能在圆内或者圆外,当抛洒点的数量大到一定程度时,抛洒点就近似构成了单位正方形的面积,用圆内点的个数除以总的抛洒点的个数,就得到了 $\frac{\pi}{4}$ ,这时候再对这个商乘以四,就可以近似的得到 $\pi$ 的近似值,而且抛洒点的数量越多,得到的 $\pi$ 值越精确。

这里要用到python的数学库,随机库,时间库里的部分函数,引用数学库是为了开平方计算抛洒点是否在圆内,随机库是为了产生大量的随机点,时间库是为了能体现出程序运行的时间。

随机库里的常用函数有

函数 含义
seed(x) 给随机数一个种子值,默认是随机种子系统时钟
random() 生成一个[0,1.0)之间的随机小数
uniform() 生成一个a到b之间的随机小数
randint(a,b) 生成一个a到b之间的随机整数
randrange(a,b,c) 随机生成一个从a开始到b以c递增的数
choice(< list >) 从列表随机返回一个元素
shuffle(< list >) 将列表的元素随机打乱
sample(< list >,k) 从指定列表获取k个元素
  • 随机数库及其使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> from random import *
    >>> random()
    0.712851564815235
    >>> uniform(1,10)
    5.48412389456316455
    >>> randint(1,10)
    9
    >>> randrange(0,10,2)
    6
    >>> ra=[0,1,2,3,4,5,6,7,8,9]
    >>> choice(ra)
    5
    >>> shuffle(ra)
    >>> ra
    [5,6,3,9,1,4,2,8,0,7]
    >>> sample(ra,4)
    [6,2,3,7]
    >>>

计算机实际上是不能真正产生随机数的,所以随机库的原理是每一个随机数都是由一个种子开始的伪随机序列。相同的随机种子产生相同的伪随机序列,这也有利于程序的验证执行。

好了扯了这么多题外话,该回到正题上了,这里计算 $\pi$ 的近似值需要产生的就是0到1之间的随机数,用到的随机库函数只有random()了。

还有数学库,调用的是sqrt(x)函数,这个是开方函数就不用多说了。

$\pi$ 值计算的IPO表示如下:

  • 输入:抛洒点的数量。
  • 处理:对于每个抛洒点,计算点到圆心的距离,通过判断该点是否在圆内,进而统计在圆内点的数量。
  • 输出: $\pi$ 值。

实例代码(这里产生了10000个点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from random import random
from math import sqrt
from time import clock
DARTS = 10000
hits = 0
clock()
for i in range(1,DARTS):
x, y = random(), random()
dist = sqrt(x**2 + y**2)
#print("dist:%s" % dist)
if dist <= 1.0:
hits = hits + 1
pi = 4*(1.0*hits/DARTS) #如果是python2,就要加1.0*,python3就可以不用
#print(pi)
#print("hits: %s" % hits)
#print("DARTS: %s" % DARTS)
print("Pi: %.5f" % pi)
print("time: %-5.5ss" % clock())

可以试验,当产生点的数量越多时,$\pi$ 的值也越精确,同时计算时间会增加许多。

第一篇python文章,求大佬勿喷。。

-------------本文结束感谢您的阅读-------------
obsidian wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持是我最大的动力!