用蒙特卡罗方法求解圆周率

分类: 程序设计 |
蒙特卡罗方法是一种计算方法。原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。
它非常强大和灵活,又相当简单易懂,很容易实现。对于许多问题来说,它往往是最简单的计算方法,有时甚至是唯一可行的方法。
它诞生于上个世纪40年代美国的"曼哈顿计划",名字来源于赌城蒙特卡罗,象征概率。
π的计算
第一个例子是,如何用蒙特卡罗方法计算圆周率π。
正方形内部有一个相切的圆,它们的面积之比是π/4。
http://www.ruanyifeng.com/blogimg/asset/2015/bg2015072611.jpg
http://www.ruanyifeng.com/blogimg/asset/2015/bg2015072603.jpg
现在,在这个正方形内部,随机产生10000个点(即10000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部。
http://www.ruanyifeng.com/blogimg/asset/2015/bg2015072604.jpg
如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。通过R语言脚本随机模拟30000个点,π的估算值与真实值相差0.07%。
以上算法用python实现。
源代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from random import random
from math import sqrt
total = 10000
x = y = inn = out = 0.0
for i in range(total):
print(total, inn, out)
print(inn*4 / total)
通过修改total的值来实现随机概率事件。
计算结果:
当total=10000时,计算的结果为3.15
当total=100000时,计算的结果为3.14528
当total=1000000时,计算的结果为3.141228
当total=10000000时,计算的结果为3.141518
当total=100000000时,计算的结果为3.14186572
当total=1000000000时,计算的结果为3.14166922
结论:
可见,随着随机概率事件次数越大,圆周率的数值就越精确。