【Java】蒙提霍尔问题的概率原理及随机化模拟
问题引入
人们常说:“相信自己的直觉”、“跟着自己的直觉走,没错的”、“要坚定自己的路”……
不是说这些话不对,但有时候结果还真不是我们直觉能get到的……
这是一个有趣的问题——三门问题,希望给大家一些启发。
三门问题
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?如果严格按照上述的条件,即主持人清楚地知道,自己打开的那扇门后是羊,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。
这个问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。
Java模拟验证
这次也不能说是什么编程实现了,只能说做个随机化模拟吧,把数据量开的大一些,就1’000’000吧,问题不大。
这个模拟的思路就是我们用一个set,装 0, 1, 2 三个数字,模拟三扇门,然后先随机生成一下0~2之间的一个随机数(也就是真正的汽车所在位置)。
接下来我们随机生成一个参赛者的选择(他没有任何场外信息,只能三蒙一),由于我们模拟的是选手更改选择的情况,所以这个就没什么意义了,那就删去它。
然后还要随机生成一个主持人打开的门。主持人显然是知道车在哪里的,不论被没被参赛者第一次选中,主持人都只会打开一扇空门(也就是藏有山羊的门)。这个随机序号不能与真正的结果重合,也不能与选手选中的序号重合(这两种情况也可能重合)。这个序列也删去它。
一共只有三个数,删了两个,就只剩一个了。我们做的模拟是选手选择换门,所以剩下的门就是他选的答案,看一看与最初的随机答案一不一致就行。
最后概率竟是2/3。
import java.util.HashSet;
import java.util.Random;
import java.util.Set;public class Main {public static void main(String[] args) {int times = 1000000;int winNum = 0;Set<Integer> set = new HashSet<>();Random random = new Random();for (int i = 0; i < times; i++) {set.add(0);set.add(1);set.add(2);//车在随机一个门后面int result = random.nextInt(3);//从三个门里面盲猜一个门int guessNum = random.nextInt(3);//剔除选项set.remove(guessNum);int removeNum = 3;while (removeNum == result || removeNum == guessNum) {removeNum = random.nextInt(3);}//主持人再删一个set.remove(removeNum);if (set.contains(result)) {winNum++;}}System.out.println("总游戏次数是:" + times);System.out.println("当更改选择的时候,获胜次数是:" + winNum);System.out.printf("更改选择的胜率是:%.3f%%", (double)winNum/times*100);}
}
一则结果:
原理
不能只是知其然,更要知其所以然。
这个问题的分析还要回归到概率论上。
容易理解的分析
先给一个不规范的分析,更好理解:
试想原先三蒙一,概率确实是1/3,但反过来考虑,不是第一次选中的概率是2/3,那在主持人帮我们排掉一个不可能情况的情况下,我们换成没人动过的门,成功的概率是2/3,是大于我们“坚持信仰”概率的。
详细分析
主持人其实没啥用,所以可以不看:
第一次选的空门(概率66.6%),之后主持人开另一个空门,换门,得到汽车。
第一次选的汽车(概率33.3%),之后主持人开另一个空门,不换门,得到汽车。
这里影响到结果的概率问题只发生在第一次选门上,如果条件如上设置,当一开始的门选定后,事件的结果也就决定了,所以这里不存在之后主持人是选择1号空门,还是2号空门的问题,所以在做概率计算是不考虑主持人的选择。
如果也要考虑主持人的话:
第一次选的空门1(概率1/3),之后主持人开另一个空门,换门,得到汽车。事件总概率1/3。
第一次选的空门2(概率1/3),之后主持人开另一个空门,换门,得到汽车。事件总概率1/3。
第一次选的汽车(概率1/3),之后主持人开另一个空门1(概率1/2),不换门,得到汽车 这个事件总概率
。
第一次选的汽车(概率1/3),之后主持人开另一个空门2(概率1/2),不换门,得到汽车 这个事件总概率
。
主持人选1号空门还是2号空门打开,这里有个主持人的选择概率,我假设的是主持人随机选择(抽签或者随意),所以各给了50%的概率,如果主持人就是喜欢1号空门,必开1号,那么也就成了1号(100%),2号(0%)了,最后结果并不影响。
所以开始选中汽车,最后换门不得奖的概率是33.3%,开始选中空门,换门最后得奖的概率是66.6%。
当然了,其实分析题意就知道主持人这边与概率根本没有关系,所以真的不必考虑他。
Ending……
类似问题(Update on 2020.2.23)
找到了一篇博客,也是类似的问题。
仔细看看就能加深理解啦!
【Java】蒙提霍尔问题的概率原理及随机化模拟相关推荐
- Java算法面试题(007) 蒙提霍尔问题(三门问题)
简介 此问题本身和算法无关,本质上一个关于概率的问题,在一些高等级的面试也经常被问及,因此收录在Java算法面试题系列中. 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问 ...
- 趣图 | 著名的悖论蒙提霍尔问题到底是什么?
来源 | 后端技术指南针 写在前面 前几天和同事聊了个问题,觉得还蛮有趣,决定和大家分享一下. Oh My God! 搞它搞它! 题目描述 我们的热心读者小明被选中参加一个抽奖游戏,游戏规则是这样的: ...
- 【概率论】蒙提霍尔问题
文章目录 三门问题 Java模拟 原理分析 简易分析 详细分析 三门问题 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问题.蒙提霍尔悖论,大致出自美国的电视游戏节目Let ...
- 蒙提霍尔游戏 python 模拟
本文使用蒙特卡罗方法验证蒙提霍尔游戏的结论. 以下代码,本人原创! 完整代码 import random# 蒙提霍尔游戏 def play_game(strategy='nonchange'):# 门 ...
- 蒙提霍尔问题及其推广
前言 蒙提霍尔问题在<人教版A版数学选择性必修三>上作为阅读与思考的材料出现 本文会提供一种简单的解法并推广这个著名的问题 文章目录 前言 蒙提霍尔问题 一.背景 二.简介 三.分析 四. ...
- 蒙提霍尔问题(The Monty Hall Problem)解析(贝叶斯分析、Python仿真)
目录 0. 前言 1. 什么是蒙提霍尔问题(Monty Hall problem) 2. Naive approach:分类讨论 3. Python蒙特卡洛仿真 4. 直观的理解1 5. 贝叶斯方法 ...
- 蒙提霍尔问题:上帝视角 + 暴力数学
#蒙提霍尔问题简述 三门问题--亦称为蒙提霍尔问题,出自美国的电视游戏节目Let's Make a Deal.问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall).问题是这样的: 参赛者面前 ...
- 三门问题(蒙提霍尔悖论)
三门问题分析 蒙提霍尔问题,又称三门悖论,出自美国的一档电视节目,问题的描述是这样的: 选手甲面前有三扇门,其中一扇门之后是汽车,其余两扇后面是山羊.选手可以选择三扇门中的任意一个并且打开后获得该扇门 ...
- Java并发机制的底层实现原理
Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...
最新文章
- 微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍...
- [微信小程序]js动态改变数组对象列表中的样式
- 智办事协同办公:数字化转型下的高效工作方式
- MSDynamicsAX2009成本处理与重估(中文)
- Oracle 索引 详解 - 索引分类
- 2020 5月 每日花语
- yolo算法的优缺点分析_yolo算法介绍
- mysql学习day04
- 协变(covariant)和逆变(contravariant)
- HDU 5552 Bus Routes(NTT+分治)
- 招投标相关法律及条例
- windows 查询域名DNS解析
- 树莓派人脸打卡机(考勤机)(Python)
- 太湖之光超级计算机应用最高奖,“神威·太湖之光”两项应用入围“戈登·贝尔”奖...
- Cascadeur笔记:导出非ASC II格式FBX的方法
- .bat文件注册.ocx+win8开机获得管理员权限+运行程序自动注册.ocx
- 二维码的后台生成及前台界面显示QRCode
- android开发歌词滑动效果_Android 歌词同步滚动效果
- 用pycharm写python_在PyCharm中使用VPython
- 如何判断点是否在凸多边形内部(用于碰撞检测)