目錄
- 前言
- 一、基礎知識————matlab隨機函式
- 1.rand(m,n)
- 2.unifrnd(a,b,m,n)
- 3.randi([a,b],m,n)
- 二、問題提出
- 三、考慮必定成功的條件下的機率————程式碼實現
- 1.初始化變數
- 2.生成隨機數,進行迴圈
- 3.輸出結果
- 四、無條件機率(考慮失敗)————程式碼實現
- 1.初始化變數
- 2.生成隨機數,進行迴圈
- 3.輸出結果
前言
蒙特卡羅方法又稱統計模擬法,是一種隨機模擬方法,以機率和統計理論方法為基礎的一種計算方法,是使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。將所求解的問題同一定的機率模型相聯絡,用電子計算機實現統計模擬或抽樣,以獲得問題的近似解。為象徵性地表明這一方法的機率統計特徵,故借用賭城蒙特卡羅命名。
一、基礎知識————matlab隨機函式
1.rand(m,n)
rand(m,n)函式產生由在[0,1]之間均勻分佈的隨機陣列成的m行n列的矩陣
rand(3) % 若只給一個輸入,則會生成一個方陣
雖然rand函式只能生成0-1的數,但我們可以利用rand*a,將其變換為生成0-a上的數
2.unifrnd(a,b,m,n)
生成從a-b的一個m行n列的矩陣
3.randi([a,b],m,n)
randi([a,b],m,n)函式可在指定區間[a,b]內隨機取出大小為m*n的整數矩陣
二、問題提出
你參加一檔電視節目,節目組提供了ABC三扇門,主持人告訴你,其中一扇門後邊有輛汽車,其它兩扇門後是空的。假如你選擇了B門,這時,主持人開啟了C門,讓你看到C門後什麼都沒有,然後問你要不要改選A門?
這個問題在機率論的領域是條件機率,但我們的目標就是用生成隨機數的方法求出:改選與不改選成功的機率是怎麼樣的。
三、考慮必定成功的條件下的機率————程式碼實現
1.初始化變數
設定好重複次數與改變主意時的成功次數與不改變主意的成功次數
n = 100000; % n代表蒙特卡羅模擬重複次數
a = 0; % a表示不改變主意時能贏得汽車的次數
b = 0; % b表示改變主意時能贏得汽車的次數
2.生成隨機數,進行迴圈
首先生成x與y的隨機數,其是從1-3的整數,x代表選擇的門,y代表有汽車的門。
在實驗中,我們只需要考慮改變主意還是不改變主意,因此只需要考慮x=y或者x~=y的情況。
因此,x==y時,不改變主意,a+1。
因此,x~=y時,不改變主意,b+1。
for i= 1 : n % 開始模擬n次
x = randi([1,3]); % 隨機生成一個1-3之間的整數x表示汽車出現在第x扇門後
y = randi([1,3]); % 隨機生成一個1-3之間的整數y表示自己選的門
% 下面分為兩種情況討論:x=y和x~=y
if x == y % 如果x和y相同,那麼我們只有不改變主意時才能贏
a = a + 1; b = b + 0;
else % x ~= y ,如果x和y不同,那麼我們只有改變主意時才能贏
a = a + 0; b = b +1;
end
end
3.輸出結果
disp(['蒙特卡羅方法得到的不改變主意時的獲獎機率為:', num2str(a/n)]);
disp(['蒙特卡羅方法得到的改變主意時的獲獎機率為:', num2str(b/n)]);
四、無條件機率(考慮失敗)————程式碼實現
1.初始化變數
只是需要多加一個變數c,表示沒有獲獎的次數,之後除以n可以得到機率
n = 100000; % n代表蒙特卡羅模擬重複次數
a = 0; % a表示不改變主意時能贏得汽車的次數
b = 0; % b表示改變主意時能贏得汽車的次數
c = 0; % c表示沒有獲獎的次數
2.生成隨機數,進行迴圈
我們這邊仍然只需要考慮whether x=y。但是在這個過程中,我們需要考慮失敗的情況,因此加入了change變數,使是否改變主意確定了是否失敗,記錄其次數
for i= 1 : n % 開始模擬n次
x = randi([1,3]); % 隨機生成一個1-3之間的整數x表示汽車出現在第x扇門後
y = randi([1,3]); % 隨機生成一個1-3之間的整數y表示自己選的門
change = randi([0, 1]); % change =0 不改變主意,change = 1 改變主意
% 下面分為兩種情況討論:x=y和x~=y
if x == y % 如果x和y相同,那麼我們只有不改變主意時才能贏
if change == 0 % 不改變主意
a = a + 1;
else % 改變了主意
c= c+1;
end
else % x ~= y ,如果x和y不同,那麼我們只有改變主意時才能贏
if change == 0 % 不改變主意
c = c + 1;
else % 改變了主意
b= b + 1;
end
end
end
3.輸出結果
disp(['蒙特卡羅方法得到的不改變主意時的獲獎機率為:', num2str(a/n)]);
disp(['蒙特卡羅方法得到的改變主意時的獲獎機率為:', num2str(b/n)]);
disp(['蒙特卡羅方法得到的沒有獲獎的機率為:', num2str(c/n)]);