如何求pi呢?
维基百科上的pi是这样的pi
MOOC上介绍了两种求pi的算法
一种是百科里的阀门算法
代码实现较为简单, 计算的精确度似乎很高.
不得不说这个求pi的公式看上去非常优美.
# -*- coding:-utf -*-
from random import *
pi = 0.0
for i in range(0, 10000):
pi += (1/pow(16, i)*(4/(8*i+1) - 2/(8*i+4) - 1/(8*i+5) - 1/(8*i+6)))
print(pi)
今天想介绍的是蒙特卡洛方法, 这是一种用统计学思维解决数学计算问题的方法.
简单来说就是, 在图形上撒点, 当点数趋近于无穷大时, 在圆上的点比上在整个正方形的点*4结果就是pi了
from random import random
from time import perf_counter
Points = 5000*5000
cnt = 0
start = perf_counter()
for i in range(Points):
x, y = random(), random()
dis = x ** 2 +y ** 2
if dis <= 1.0:
cnt += 1
pi = 4*cnt/Points
print("{:.7f}".format(pi))
print("运行时间是: {:.7f}s".format(perf_counter() - start))
实测: 消耗相同的计算力, pi的精度远远没有阀门算法高
但这不失为一种对精度要求不高的计算的简便方法.
如对函数y = x*x, 和y = 0, x = 1, x = 0围绕图形的面积
计算机随机生成随机数, 简单计算一下就可以得到面积, 而不用使用复杂的数学推导.
这种计算思维很值得学习
from random import random
time = 2000*2000
cnt = 0.0
for i in range(time):
x, y = random(), random()
if 0 <= x*x <= y:
cnt += 1
S = cnt/time
print("{:.4f}".format(S))
话说π真的是很奇妙的东西啊