目录
1. 大数定律
大数定律是蒙特卡罗算法的理论依据,大数定律的内容如下
在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。
我们来简单看看伯努利大数定律的严格数学表达:
设是次独立试验中事件A发生的次数,且事件A在每次试验中发生的概率为,则对任意正数 有
通俗地说,这个定理就是在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。
2. 估算圆周率
蒙特卡罗算法可以用来估计面积,而圆的面积和有关,所以我们也可以用蒙特卡罗算法来估计的值。
2.1 公式
我们来在正方形内撒个点,记落在圆内的点的个数为个,记点落在圆内的概率为,那么由古典概型我们知道,由伯努利大数定律我们知道 ,于是我们得到 .
2.2 代码
代码基本思路就是生成大量随机数,判断是否在圆内得到,直接代公式就行。
import random
def pai():
n = 1000000
r = 1.0
a, b = (0.0, 0.0)
x_neg, x_pos = a - r, a + r
y_neg, y_pos = b - r, b + r
m = 0
for i in range(0, n):
x = random.uniform(x_neg, x_pos)
y = random.uniform(y_neg, y_pos)
if x*x + y*y <= 1.0:
m += 1
print 4*m/float(n)
2. 估算定积分
蒙特卡罗算法还常用于计算定积分的近似值。
3.1 公式
首先由积分第一中值定理我们得到:,这里的 就相当于这个区间上所有函数值的平均值,我们现在在x轴上随机取个点,计算对应函数值,计算平均值,于是我们有 ,最后得到 。
3.2 代码
我们以 为例。
def integral():
n = 1000000
x_min, x_max = 0.0, 1.0
y_min, y_max = 5.0, 8.0
m = 0
for i in range(0, n):
x = random.uniform(x_min, x_max)
y = random.uniform(y_min, y_max)
# x*x*x+2*x*x+5 > y,
if x*x*x+2*x*x+5 > y:
m += 1
integral_value = m / float(n)
print integral_value