概述
20 世纪 40 年代,由于电子计算机的出现, 借助计算机可以实现大量的随机抽样试验,为利用随机试验方法解决实际问题提供了便捷。 非常具代表性的例子是, 美国在第二次世界大战期间研制原子弹的“曼哈顿计划”中,为了解决核裂变物质的中子随机扩散问题,数学家冯•诺伊曼( Von Neumann)和乌拉姆( Stanislaw Marein Ulam)等人提出的随机模拟方法, 出于保密的缘故, 当时给这种方法起了一个代号叫蒙特卡洛。蒙特卡洛(Monte Carlo)本是摩纳哥的一个赌城的名字,用赌城的名字作为随机模拟方法的名称,既反映了该方法的部分内涵,又具有一定神秘性和便于记忆,因而很快就得到人们的普遍接受。 目前这一方法已经广泛地运用到了数学、物理、管理、生物遗传、社会科学等众多领域,并显示出了特殊
的优越性。
蒙特卡洛仿真定义:
蒙特卡洛仿真方法(MC)又称为随机取样法或统计模拟法, 它是以概率统计为理论基础并利用随机数的统计规律来进行计算和模拟的方法,通过大量的简单的重复抽样和计算来解决问题,它既可应用于数值计算,也可用于模拟仿真。
蒙特卡洛仿真与大数定理的关系:
蒙特卡洛仿真强烈依赖大数定理(频率会趋近于其理论概率,平均值趋近于理论期望值)。大数定理是蒙特卡洛方法有效性和收敛性的数学基石。它保证了通过生成大量独立同分布的随机样本并计算其均值,最终能够逼近难以直接计算的复杂期望值。没有大数定理,蒙特卡洛仿真就失去了其理论依据和可靠性保证。理解大数定理对于深入理解和正确应用蒙特卡洛方法至关重要。
蒙特卡洛仿真与MATLAB中rng函数的关系:
- 蒙特卡洛仿真 是方法:依赖大量随机抽样来求解问题。
- 伪随机数生成器 是工具:为蒙特卡洛仿真提供“随机”样本。
rng
是控制器:通过设置种子来控制伪随机数生成器的起始点。- 核心关联:
rng
设置的种子直接决定了蒙特卡洛仿真中随机样本序列的起点,从而决定了仿真结果的可重复性(相同种子 => 相同结果)或可变性(不同种子/shuffle
=> 不同结果)。
下面是一些较为详细的介绍。
一、蒙特卡洛仿真是什么?
- 核心思想: 利用随机抽样和统计方法来解决复杂确定性问题或模拟随机系统行为的一种计算方法。它的名字来源于摩纳哥著名的赌城蒙特卡洛,象征着随机性和概率。
- 基本原理:
- 定义问题: 明确你要解决的问题或模拟的系统。这个问题通常涉及不确定性或概率,或者可以用概率模型来近似。
- 构建概率模型: 为问题中涉及的随机变量或过程建立数学模型。例如,模拟股价变动可能需要基于几何布朗运动模型生成随机路径。
- 生成随机样本: 使用计算机的随机数生成器,根据定义的概率分布(如均匀分布、正态分布、泊松分布等)生成大量的随机数或随机路径。这些随机数代表了模型中的不确定性。
- 执行模拟计算: 对生成的每一个随机样本(或一组样本),代入你的确定性模型或系统规则中进行计算,得到一个可能的结果或观测值。
- 统计分析: 收集所有模拟运行的结果。利用统计学方法(如计算平均值、方差、概率、置信区间、绘制直方图等)对这些结果进行分析,得到问题的近似解或系统行为的统计特性(如期望值、风险概率、系统性能指标等)。
- 关键特点:
- 基于随机性: 核心是生成大量随机样本。
- 数值方法: 提供的是数值解而非解析解。
- 大数定律: 模拟次数越多(样本量越大),统计结果通常越接近理论值或真实情况(收敛性)。
- 处理复杂问题: 特别擅长解决高维度、多变量、非线性、路径依赖等难以用传统解析方法求解的复杂问题。
- 应用广泛: 金融工程(期权定价、风险评估)、物理模拟(粒子输运)、工程可靠性分析、供应链优化、机器学习(集成方法如随机森林)、计算生物学等。
- 简单例子: 估算圆周率 π。在单位正方形内随机投点,计算落在内切圆内的点所占比例。这个比例乘以 4 就是 π 的蒙特卡洛估计值。投点次数越多,估计越准。这里,点的坐标就是随机样本。
二、蒙特卡洛仿真与 MATLAB 中 rng
的关联
蒙特卡洛仿真的核心步骤是生成随机样本。在 MATLAB(以及其他编程语言/软件)中,计算机本身无法产生真正的随机数,而是生成伪随机数。
- 伪随机数: 通过一个确定的数学算法(伪随机数生成器 - PRNG)从一个初始值(称为种子)开始计算出来的一系列数字。这些数字看起来是随机的(满足统计上的随机性检验),并且具有可重复性。
rng
函数的作用: MATLAB 的rng
函数就是用来控制伪随机数生成器的状态,其核心功能之一就是设置种子。rng(seed)
: 将随机数生成器的种子设置为一个特定的非负整数seed
(例如rng(42)
)。rng('shuffle')
: 根据当前时间(通常是时钟)设置种子,使得每次运行程序时种子不同。rng('default')
: 将生成器重置回 MATLAB 启动时的默认设置(包括默认种子和算法)。s = rng
: 获取当前随机数生成器的状态(一个包含种子、算法等信息的结构体)。rng(s)
: 将随机数生成器恢复到之前保存的状态s
。
rng
与蒙特卡洛仿真的关键关联:- 结果可重复性: 这是最重要的关联!设置相同的种子 (
rng(seed)
) 可以确保每次运行你的蒙特卡洛仿真程序时,生成的随机数序列是完全相同的。这对于以下情况至关重要:- 调试: 当程序出错时,固定种子可以让你在完全相同的输入(随机数)条件下重现错误,便于定位问题。
- 算法验证/比较: 比较不同算法或参数在同一组随机输入下的表现,确保比较的公平性。
- 结果复现: 发表论文或分享代码时,让其他人能够精确复现你的仿真结果。
- 确定性测试: 在开发阶段,有时需要暂时消除随机性以测试逻辑流程。
- 结果可变性: 如果你不设置种子或使用
rng('shuffle')
,那么每次运行程序都会产生不同的随机数序列,从而导致蒙特卡洛仿真的结果(如均值、方差、概率估计)也会略有不同。这代表了仿真中固有的随机性。多次运行(不同种子)的结果可以用来评估仿真结果本身的波动性(即蒙特卡洛误差)。 - 控制随机源:
rng
设置的是全局随机数流的起点。之后调用rand
,randn
,randi
等函数生成的各种分布(均匀、正态、离散均匀等)的随机数,其序列都取决于这个初始种子。确保整个仿真使用的所有随机数都源于同一个可控的起点。
- 结果可重复性: 这是最重要的关联!设置相同的种子 (
总结两者的关系
- 蒙特卡洛仿真 是方法:依赖大量随机抽样来求解问题。
- 伪随机数生成器 是工具:为蒙特卡洛仿真提供“随机”样本。
rng
是控制器:通过设置种子来控制伪随机数生成器的起始点。- 核心关联:
rng
设置的种子直接决定了蒙特卡洛仿真中随机样本序列的起点,从而决定了仿真结果的可重复性(相同种子 => 相同结果)或可变性(不同种子/shuffle
=> 不同结果)。
MATLAB 代码示例说明关联
% 情形 1: 固定种子 - 结果可重复
rng(123); % 设置种子为 123
results1 = run_monte_carlo_simulation(1000); % 运行1000次模拟
% ... 稍后,再次运行 ...
rng(123); % 再次设置相同的种子
results2 = run_monte_carlo_simulation(1000); % results2 应该完全等于 results1
% 情形 2: 不固定种子 (或使用 rng('shuffle')) - 结果通常不同
% rng('shuffle'); % 如果用这行,每次种子都不同
resultsA = run_monte_carlo_simulation(1000);
resultsB = run_monte_carlo_simulation(1000); % resultsB 很可能不同于 resultsA
在这个例子中,run_monte_carlo_simulation
函数内部会多次调用 rand
, randn
等函数来生成随机输入。rng(123)
确保了这两次调用该函数时,rand
, randn
等函数产生的序列是完全相同的,因此 results1
和 results2
必然相同。如果没有 rng(123)
,或者使用了 rng('shuffle')
,那么每次调用 run_monte_carlo_simulation
时生成的随机序列不同,导致 resultsA
和 resultsB
不同。
因此,在编写和运行蒙特卡洛仿真程序时,明智地使用 rng
来控制随机数种子是保证结果科学性和可管理性的关键一步。