蒙特算法
蒙特卡罗法也称统计模拟法、统计试验法,是把概率现象作为研究对象的数值模拟方法
是按抽样调查法求取统计值来推定未知特性量的计算方法。
蒙特卡罗是一类随机算法的统称,其主要思想是采样越多,得到的结果越近似于最优解。更多的是从总体中抽一个样本,计算估计量(均值等),作为整体估计。
实例1:蒙塔卡洛方法求圆周率
在图中区域产生足够多的随机数点,然后计算落在圆内的点的个数与总个数的比值再乘以4,就是圆周率
import math
import random
m = 1000
n = 0
for i in range(m):
x = random.random()
y = random.random()
if math.sqrt(x**2 + y**2) < 1:
n+=1
pi = 4 * n / m
print("pi = {}".format(pi))
输出:
模拟次数增加至1000000次 输出:
实例2:计算函数 y = x方在[0,1]区间的定积分
import math
import random
m = 1000000
n = 0
for i in range(m):
x = random.random()
y = random.random()
if y >= x**2:
n += 1
r = n/m
print("r = {}".format(r))
输出:
三门问题:
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门则各藏有一只山羊。
当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后问参赛者要不要换另一扇仍然关上的门。
问题是:换另一扇门是否会增加参赛者赢得汽车的几率?如果严格按照上述条件,即主持人清楚地知道,自己打开的那扇门后面是羊,那么答案是会。不换门的话,赢得汽车的几率是1/3,,换门的话,赢得汽车的几率是2/3。
进行100次模拟:
import random
def play(change):
prize = random.randint(0,2)
guess = random.randint(0,2)
if guess == prize:
if change:
return False
else:
return True
else:
if change:
return True
else:
return False
def winRate(change, N):
win = 0
for i in range(N):
if(play(change)):
win += 1
print("中奖率为{}".format(win / N))
N = 100
print("每次换门的中奖概率:")
winRate(True,N)
print("每次都不换门的中奖概率:")
winRate(False,N)
输出:
进行1000次模拟:
更改n为1000 输出:
进行1000000次模拟:
更改n为1000000 输出:
可以发现,模拟次数越多,得到的结果越近似于最优解,也体现出蒙塔卡洛的思想,把概率作为研究对象数值模拟方法,采样越多,得到的结果越近似于最优解。从总体中抽一个样本,计算估计量(均值等),作为整体估计。