蒙特卡洛法简介

方法介绍

蒙特卡洛方法(英语:Monte Carlo method),也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。

通常蒙特卡洛方法可以粗略地分成两类:

一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。例如在核物理研究中,分析中子在反应堆中的传输过程。中子与原子核作用受到量子力学规律的制约,人们只能知道它们相互作用发生的概率,却无法准确获得中子与原子核作用时的位置以及裂变产生的新中子的行进速率和方向。科学家依据其概率进行随机抽样得到裂变位置、速度和方向,这样模拟大量中子的行为后,经过统计就能获得中子传输的范围,作为反应堆设计的依据。

另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。通过随机抽样的方法,以随机事件出现的频率估计其概率,或者以抽样的数字特征估算随机变量的数字特征,并将其作为问题的解。这种方法多用于求解复杂的多维积分问题。

通常蒙特卡洛方法通过构造符合一定规则的随机数来解决数学上的各种问题。对于那些由于计算过于复杂而难以得到解析解或者根本没有解析解的问题,蒙特卡洛方法是一种有效的求出数值解的方法。一般蒙特卡洛方法在数学中最常见的应用就是蒙特卡洛积分。

蒙特卡洛算法也常用于机器学习,特别是强化学习的算法中。一般情况下,针对得到的样本数据集创建相对模糊的模型,通过蒙特卡洛方法对于模型中的参数进行选取,使之于原始数据的残差尽可能的小。从而达到创建模型拟合样本的目的。

随机过程模拟

抛硬币对赌,正面:赌徒赢庄家1元;反面:庄家赢赌徒1元。赌徒本钱10元,输完出局。模拟赌博过程。

每一次抛硬币都是伯努利试验,赢的概率是0.5,赌博这一过程就是这一串伯努利试验构成的随机过程。

对某一个特定的赌徒,一旦进入赌局,最终由每轮赌局结果构成的序列就是唯一的。如果要观察整个赌博过程的整体特征,就要使用蒙特卡洛法,采用大量样本,最终观察样本结果的整体特征。

采用10个赌徒,轮数100轮,如果赌本输光,提前退出;如果100轮之后还有赌本,也停止赌局。

import pandas as pd
import random
sample_list = []
round_mun = 1000
gambler_num = 10
for gambler in range(1, gambler_num+1):
    money = 10
    for roundss in range(1, round_mun+1):
        result = random.randint(0, 1)
        if result == 1:
            money = money+1
        elif result == 0:
            money = money - 1
        if money == 0:
            break
    sample_list.append([gambler,roundss,money])
sample_df = pd.DataFrame(sample_list, columns=['gambler','roundss','money'])
sample_df.set_index('gambler', inplace=True)
print(sample_df)

print("总轮数:{},总人数:{}".format(round_mun,gambler_num))
print("输光赌本提前出局的人数:{}".format(gambler_num - len(sample_df[sample_df['roundss']==round_mun])))
print("赌满全场且盈利的人数:{}".format(len(sample_df[sample_df['money']>10])))
print("赌满全场且亏损的人数:{}".format(len(sample_df[sample_df['money']<=10][sample_df['money']>0])))

结果

总轮数:100,总人数:100
输光赌本提前出局的人数:34
赌满全场且盈利的人数:45
赌满全场且亏损的人数:20
总轮数:1000,总人数:100
输光赌本提前出局的人数:78
赌满全场且盈利的人数:19
赌满全场且亏损的人数:3
总轮数:10000,总人数:100
输光赌本提前出局的人数:93
赌满全场且盈利的人数:7
赌满全场且亏损的人数:0

随着赌局的增加,赌徒基本上都破产被收割了。因为庄家的资金量是无穷的。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木头人的星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值