问题引入

人们常说:“相信自己的直觉”、“跟着自己的直觉走,没错的”、“要坚定自己的路”……

不是说这些话不对,但有时候结果还真不是我们直觉能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】蒙提霍尔问题的概率原理及随机化模拟相关推荐

  1. Java算法面试题(007) 蒙提霍尔问题(三门问题)

    简介 此问题本身和算法无关,本质上一个关于概率的问题,在一些高等级的面试也经常被问及,因此收录在Java算法面试题系列中. 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问 ...

  2. 趣图 | 著名的悖论蒙提霍尔问题到底是什么?

    来源 | 后端技术指南针 写在前面 前几天和同事聊了个问题,觉得还蛮有趣,决定和大家分享一下. Oh My God! 搞它搞它! 题目描述 我们的热心读者小明被选中参加一个抽奖游戏,游戏规则是这样的: ...

  3. 【概率论】蒙提霍尔问题

    文章目录 三门问题 Java模拟 原理分析 简易分析 详细分析 三门问题 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问题.蒙提霍尔悖论,大致出自美国的电视游戏节目Let ...

  4. 蒙提霍尔游戏 python 模拟

    本文使用蒙特卡罗方法验证蒙提霍尔游戏的结论. 以下代码,本人原创! 完整代码 import random# 蒙提霍尔游戏 def play_game(strategy='nonchange'):# 门 ...

  5. 蒙提霍尔问题及其推广

    前言 蒙提霍尔问题在<人教版A版数学选择性必修三>上作为阅读与思考的材料出现 本文会提供一种简单的解法并推广这个著名的问题 文章目录 前言 蒙提霍尔问题 一.背景 二.简介 三.分析 四. ...

  6. 蒙提霍尔问题(The Monty Hall Problem)解析(贝叶斯分析、Python仿真)

    目录 0. 前言 1. 什么是蒙提霍尔问题(Monty Hall problem) 2. Naive approach:分类讨论 3. Python蒙特卡洛仿真 4. 直观的理解1 5. 贝叶斯方法 ...

  7. 蒙提霍尔问题:上帝视角 + 暴力数学

    #蒙提霍尔问题简述 三门问题--亦称为蒙提霍尔问题,出自美国的电视游戏节目Let's Make a Deal.问题的名字来自该节目的主持人蒙提·霍尔(Monty Hall).问题是这样的: 参赛者面前 ...

  8. 三门问题(蒙提霍尔悖论)

    三门问题分析 蒙提霍尔问题,又称三门悖论,出自美国的一档电视节目,问题的描述是这样的: 选手甲面前有三扇门,其中一扇门之后是汽车,其余两扇后面是山羊.选手可以选择三扇门中的任意一个并且打开后获得该扇门 ...

  9. Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...

最新文章

  1. 微软BI 之SSAS 系列 - 在 SQL Server 2012 下查看 SSAS 分析服务的模型以及几个模型的简单介绍...
  2. [微信小程序]js动态改变数组对象列表中的样式
  3. 智办事协同办公:数字化转型下的高效工作方式
  4. MSDynamicsAX2009成本处理与重估(中文)
  5. Oracle 索引 详解 - 索引分类
  6. 2020 5月 每日花语
  7. yolo算法的优缺点分析_yolo算法介绍
  8. mysql学习day04
  9. 协变(covariant)和逆变(contravariant)
  10. HDU 5552 Bus Routes(NTT+分治)
  11. 招投标相关法律及条例
  12. windows 查询域名DNS解析
  13. 树莓派人脸打卡机(考勤机)(Python)
  14. 太湖之光超级计算机应用最高奖,“神威·太湖之光”两项应用入围“戈登·贝尔”奖...
  15. Cascadeur笔记:导出非ASC II格式FBX的方法
  16. .bat文件注册.ocx+win8开机获得管理员权限+运行程序自动注册.ocx
  17. 二维码的后台生成及前台界面显示QRCode
  18. android开发歌词滑动效果_Android 歌词同步滚动效果
  19. 用pycharm写python_在PyCharm中使用VPython
  20. 如何判断点是否在凸多边形内部(用于碰撞检测)

热门文章

  1. 使用exp导出导入,需要注意的问题。
  2. js判断字符是否为空的方法
  3. 浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别
  4. Java占位符替换工具类
  5. jquery 简单日历
  6. Windows管道技术
  7. 图论算法(一)--最短路径的DFS/BFS解法(JAVA )
  8. decode()、nvl()等用法详解
  9. 计算机基本运行方式,我今天才知道的电脑运行方式,你知道吗?
  10. ffmpeg rtsp转hls_Qt音视频开发24-ffmpeg音视频同步