蒙特卡洛算法
1 简介
蒙特卡罗法也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调查法求取统计值来推定未知特性量的计算方法。
2 步骤
1.构造或描述概率过程
2.实现从已知概率分布抽样
3.求解估计值
3 实例
3.1 求解圆周率
在上图的半圆中随机生成大量的点(M个),统计有N个在圆内。
N
M
=
π
r
2
/
4
1
π
=
4
N
M
\frac{N}{M} = \frac{\pi r^2 / 4}{1} \\ \pi = \frac{4 N}{M}
MN=1πr2/4π=M4N
import math
import random
M = 5000 # 随机点总数
N = 0 # 圆内随机点数
for i in range(M):
x = random.random()
y = random.random()
if math.sqrt(x**2 + y ** 2) < 1:
N = N + 1
pi = 4 * N / M
print(pi)
3.2 求解顶积分
例题:求解 y = x 2 y = x ^ 2 y=x2在[0,1]的定积分。
import random
M = 5000 # 随机点总数
N = 0 # 曲线下的随机点数
for i in range(M):
x = random.random()
y = random.random()
if x ** 2 > y:
N = N + 1
R = N / M
print(R)
3.3 求解三门问题
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。(摘自百度百科)
import random
def func(change):
prize = random.randint(0, 2)
guess = random.randint(0, 2)
if(prize == guess):
if(change):
return False
else:
return True
else:
if(change):
return True
else:
return False
def rate(change, N):
M = 0
for i in range(N):
if(func(change=change)):
M = M + 1
return M / N
if __name__ == '__main__':
print('每次都换')
print('中奖率', rate(True, 10000))
print('每次都不换')
print('中奖率', rate(False, 10000))