蒙特卡洛模拟
Monte Carlo Simulation
Introduction
蒙特卡洛是西欧小国摩纳哥最著名的一区,以豪华的赌场闻名于世。(赌场,意味着大量重复的随机过程)
蒙特卡洛模拟是一种,通过大量随机采样,预测不确定事件可能结果的的数学技术。这个想法的数学保证是大数定律(Law of large numbers):样本数量越多,则其算术平均值就有越高的概率接近期望值
例子:相邻K的概率
问题:如果我们随机打乱一副牌(54张,加大小王),并按照打乱后的顺序依次平铺在桌面上,请问出现“两个K相邻”的概率是多少?
首先我们从理论上求解一下这个问题。设\(P(k相邻)\)表示题目所示条件的概论。根据总概率为1的条件,显而易见,\(P(k相邻)=1-P(k不相邻)\)。要想计算k不相邻的情况,可以先把剩余50张牌完全打乱,然后将4张k随机插到由50张版形成的间隔中。
\[P(k相邻)=1-P(k不相邻)=1-\frac{\frac{51!}{(51-4)!}\times50!}{54!}\approx20.98\%
\]
现在我们用蒙特卡洛模拟来尝试一下!
编写随机过程如下:
import random
length=54
cards=[0]*length
def init():
for i in range(length):
cards[i]=i
def debug():
print(cards)
def check():
for i in range(length-1):
if cards[i]//4==12 and cards[i]//4==cards[i+1]//4:
return True
return False
def monte_carlo(n):
ans=0
for i in range(n):
init()
random.shuffle(cards)
ans+=check()
return ans/n*100
rep=[100,1000,10000,15000,20000,30000]
data=[]
for i in range(len(rep)):
data.append(monte_carlo(rep[i]))
运行程序,看看我们的结果
顺着随机采样次数变多,结果与理论值越来越接近~