蒙特卡洛模擬(1)————三門問題

卢宇博發表於2024-07-29

目錄
  • 前言
  • 一、基礎知識————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)]);

相關文章