蒙特卡洛模拟

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]))

运行程序,看看我们的结果
image

顺着随机采样次数变多,结果与理论值越来越接近~

posted @ 2023-07-25 19:54  ticmis  阅读(52)  评论(0编辑  收藏  举报