(基于matlab)蒙特卡罗法 之 三门实验 (2/10)

(模拟重复一亿次)

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的机率。如果严格按照上述的条件,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3

(来源于百度百科)

1)预备知识

% randi([a,b],m,n)函数可在指定区间[a,b]内随机取出大小为m*n的整数矩阵

% randi([1,5])   %在区间[1,5]内随机取出1个整数

% 字符串的连接方式:(1)['字符串1','字符串2'] (2)strcat('字符串1','字符串2')

% num2str函数:将数值转换为字符串,通常方便输出

disp([num2str(111),'你好'])

%假设改变主意是随机的

2)蒙特卡罗用于模拟三门问题

n = 100000000;  % n代表蒙特卡罗模拟重复一亿次

a = 0;  % 不改变主意时能赢得汽车的次数

b = 0;  % 改变主意时能赢得汽车的次数

c = 0;  % 没有获奖的次数

for i= 1 : 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=yx~=y

    if x == y   % 如果xy相同,那么我们只有不改变主意时才能赢

        if change == 0  % 不改变主意

            a = a + 1;

        else  % 改变了主意

            c= c+1;

        end

    else  % x ~= y ,如果xy不同,那么我们只有改变主意时才能赢

         if change == 0  %不改变主意

            c = c + 1;

        else  % 改变了主意

            b= b + 1;

         end

    end

end

disp(['蒙特卡罗方法得到的不改变主意时的获奖概率为:', num2str(a/n)]);

disp(['蒙特卡罗方法得到的改变主意时的获奖概率为:', num2str(b/n)]);

disp(['蒙特卡罗方法得到的没有获奖的概率为:', num2str(c/n)]);

输出: 

111你好

蒙特卡罗方法得到的不改变主意时的获奖概率为:0.1667

蒙特卡罗方法得到的改变主意时的获奖概率为:0.33333

蒙特卡罗方法得到的没有获奖的概率为:0.49997

可以看到,已经开了一个门,剩下两个们至少有一个们是大奖 所以获大奖概率为1/2,模拟结果符合实际,至于在获奖的前提下改变注意和不改变主意的获奖比例也是2:1也符合实际。

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个基于 MATLAB蒙特卡罗模拟光传输问题的示例代码: ```matlab % 定义介质的几何形状和光线的入射方向和位置 % 这里以一个平板介质为例 thickness = 1; % 介质厚度 n1 = 1; % 空气的折射率 n2 = 1.52; % 介质的折射率 x0 = 0; y0 = 0; z0 = -thickness/2; theta0 = 0; phi0 = 0; % 定义模拟参数 N = 100000; % 模拟次数 dist = zeros(N,1); % 用于存储光线传输距离 for i = 1:N % 随机生成传输方向和位置 theta = rand*pi; % 传输角度 phi = rand*2*pi; % 传输方位角 r = -log(rand)/n2; % 传输距离,服从指数分布 % 计算光线的传输位置和折射角度 x = x0 + r*sin(theta)*cos(phi); y = y0 + r*sin(theta)*sin(phi); z = z0 + r*cos(theta); [theta1,phi1] = refract(theta, phi, n1, n2); % 判断光线是否穿过介质 if z > thickness/2 && abs(x) < thickness/2 && abs(y) < thickness/2 dist(i) = r; end end % 计算传输概率 p = sum(dist>0)/N; fprintf('传输概率为: %f\n',p); % 折射函数 function [theta1,phi1] = refract(theta, phi, n1, n2) % 计算入射角和折射角 sin_theta1 = sin(theta); sin_phi1 = sin(phi); cos_theta1 = sqrt(1 - sin_theta1^2); cos_phi1 = sqrt(1 - sin_phi1^2); sin_theta2 = n1/n2*sin_theta1; cos_theta2 = sqrt(1 - sin_theta2^2); % 计算折射角度 theta1 = acos(cos_theta2); if sin_theta1 == 0 phi1 = phi; else phi1 = phi + asin(sin_theta2/sin_theta1*cos_phi1); end end ``` 这是一个简单的示例代码,它模拟了光线从平板介质中传输的问题。代码中使用了 rand 函数来生成随机数,计算传输位置和传输距离,并通过判断传输距离是否穿过介质来判断光线是否传输成功。折射函数用于计算光线的折射角度。 需要注意的是,这只是一个简单的示例代码,实际应用中需要根据具体问题进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君无戏言。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值