随机数求面积_蒙特卡洛方法_阀门算法

版权声明:看我干嘛? 你又没打算转载我的博客~ https://blog.csdn.net/wjh2622075127/article/details/79940046

如何求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))

话说π真的是很奇妙的东西啊

阅读更多
换一批

没有更多推荐了,返回首页