概述
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
來控制隨機數種子是保證結果科學性和可管理性的關鍵一步。