蒙特卡洛方法简介
- 概念
蒙特卡罗法也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调查法求取统计值来推定未知特性量的计算方法。蒙特卡罗是摩纳哥的著名赌城,该法为表明其随机抽样的本质而命名。故适用于对离散系统进行计算仿真试验。在计算仿真中,通过构造一个和系统性能相近似的概率模型,并在数字计算机上进行随机试验,可以模拟系统的随机特性。
- 基本思路
蒙特卡罗的基本思想是:为了求解问题,首先建立一个概率模型或随机过程,使它的参数或数字特征等于问题的解:然后通过对模型或过程的观察或抽样试验来计算这些参数或数字特征,最后给出所求解的近似值。解的精确度用估计值的标准误差来表示。蒙特卡罗法 [4] 的主要理论基础是概率统计理论,主要手段是随机抽样、统计试验。用蒙特卡罗法求解实际问题的基本步骤为:
(1)根据实际问题的特点.构造简单而又便于实现的概率统计模型.使所求的解恰好是所求问题的概率分布或数学期望;
(2)给出模型中各种不同分布随机变量的抽样方法;
(3)统计处理模拟结果,给出问题解的统计估计值和精度估计值。 - 优点
- 方法的误差与问题的维数无关。
- 对于具有统计性质问题可以直接进行解决。
- 对于连续性的问题不必进行离散化处理。
- 缺点
- 对于确定性问题需要转化成随机性问题。
- 误差是概率误差。
- 通常需要较多的计算步数N。
三门问题
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
蒙特卡罗方法之三门问题----代码实现
import numpy as np
class MonteCarlo_ThreeDoor:
def __init__(self):
self.award = np.random.randint(0, 3) # 门后面的奖品
self.choice = np.random.randint(0, 3) # 参赛者的选择
def game(self, change_door):
if self.award == self.choice: # 当参赛者猜中时
if change_door:
return False # 猜错
else:
return True # 猜对
else: # 当参赛者猜错时
if change_door:
return True
else:
return False
@staticmethod
def win_probability(num, change_door):
count = 0
for i in range(num):
if MonteCarlo_ThreeDoor().game(change_door):
count += 1 # 统计在这num次中最终猜对的次数
win_pro = count / num
return win_pro # 中奖的概率
if __name__ == '__main__':
mt = MonteCarlo_ThreeDoor()
win_pro = mt.win_probability(1000000, True) # True:换门
print(f'这1000000次都换门中奖的概率为:{win_pro}')