蒙特卡洛模拟(1)————三门问题

前言

蒙特卡罗方法又称统计模拟法,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。

一、基础知识————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)]);
posted @ 2024-07-29 16:26  卢宇博  阅读(43)  评论(0编辑  收藏  举报