蒙特卡洛模拟

Monte Carlo Simulation

Introduction

蒙特卡洛是西欧小国摩纳哥最著名的一区,以豪华的赌场闻名于世。(赌场,意味着大量重复的随机过程)

蒙特卡洛模拟是一种,通过大量随机采样,预测不确定事件可能结果的的数学技术。这个想法的数学保证是大数定律(Law of large numbers):样本数量越多,则其算术平均值就有越高的概率接近期望值

例子:相邻K的概率

问题:如果我们随机打乱一副牌(54张,加大小王),并按照打乱后的顺序依次平铺在桌面上,请问出现“两个K相邻”的概率是多少?

首先我们从理论上求解一下这个问题。设P(k)表示题目所示条件的概论。根据总概率为1的条件,显而易见,P(k)=1P(k)。要想计算k不相邻的情况,可以先把剩余50张牌完全打乱,然后将4张k随机插到由50张版形成的间隔中。

P(k)=1P(k)=151!(514)!×50!54!20.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 @   ticmis  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示