蒙特卡洛算法
1.引入
通过向矩形上撒大量小米,通过小米数量的比值来确定圆的面积。我们把小米均匀的分布在矩形上,并且数一数圆内小米的数量 Nc和全部小米Ns的数量,矩形面积Ss和圆面积Sc就有如下的比例关系:
2.引例应用到求定积分
数学上定积分的几何意义就是求面积,设定求任意的可积函数f(x),在任意的积分区间[a,b]上的定积分,可以沿用撒小米的方式得到函数的积分值。对于稍微复杂的积分,找到解析解就会困难,采用蒙特卡洛算法就能够以任意精度的方式逼近这个积分值。
例子:
思路:代码:
import numpy
import random
m = 100000
n = 0
for i in range(m): #循环产生随机点
#在0<x<1,0<y<1的正方形中产生随机点
x = random.random() #产生0~1之间的随机数
y = random.random()
#通过比较f(x)与y的大小关系,判断点的位置
if numpy.log(1+x) / (1+x*x) > y:
n = n+1 #计数点在积分区域内的
ans = n/m #比值得面积
print(ans)
运行结果:
3.三扇门问题
有三扇门,一扇门的后面是汽车,另两扇门后面是山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
思路:
代码:
import math
import random
N = 1000000
def play(change):
prize = random.randint(0,2) #门后是汽车的编号
first = random.randint(0,2) #首次选择的编号
#True代表中奖 False表示不中奖
if first == prize:
if change:
return False
else:
return True
else:
if change:
return True
else:
return False
def probability(change, N):
s = 0 #中奖次数统计
for i in range(N): #循环产生随机数进行判断
if(play(change)):
s += 1
print("中奖的概率为{}".format(s / N)) #计算概率
print("换门的中奖概率:")
probability(True,N)
print("不换门的中奖概率:")
probability(False,N)
运行结果: