题目:智力电视节目里有三扇门,其中两扇门背后各是一只羊,还有一扇背后是一辆汽车。参赛者先选择一扇门,然后主持人打开剩下两扇其中一扇背后必定是羊的门。这时参赛者跟换选项是否得到汽车的概率更大呢?如果更换了概率是多少?

这道题算是很经典的博弈论了,网上一搜一大把,但是好像没有从编程角度出发去解决这个问题的,所以身为程序员的我,怎么能不用程序去跑一边呢?于是乎,代码就出来了。(为了统计的准确性,我们将次数放大到100000次,这样得到的数据更加准确)

public class Test {public static void main(String[] str) {int j = 0;//累计主持人筛选后剩下的那扇门是车的次数Random random = new Random();for (int i = 0; i < 100000; i++) {int car = random.nextInt(3);//在三个数据中随机生成一辆车(0,1,2)int choose = random.nextInt(3);//嘉宾从(0,1,2)中选择if (car == choose) {//如果选择是正确的,那么被主持人筛出后剩下的那扇门几率为0,肯定不为车,所以此处不用累加j} else {//假如选择是错误的,那么车肯定被主持人给筛选剩下了,那么必为车,则j累加j++;}}System.out.print("主持人筛选后剩下那扇门是车的次数为:"+j);}
}

多执行几次,查看结果:

主持人筛选后剩下那扇门是车的次数为:66822
主持人筛选后剩下那扇门是车的次数为:66719
主持人筛选后剩下那扇门是车的次数为:66741

概率大概为2/3,所以嘉宾更换选项获取车的几率更大!

后来对比别人做的发现,这差距有点大啊,我一点面向对象的思想都没有,真是惭愧啊,下面贴上大神代码:

package test;import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class ThreeDoors {private static final int doorNumber = 3;private static List<Door> doorList = new ArrayList<Door>(doorNumber);private static void init(){doorList.clear();for (int i = 0; i < doorNumber; i++) {doorList.add(new Door(i));}}private static int getRandomDoor(int doorNumber) {return new Random().nextInt(doorNumber);}private static void setCar() {int carDoorNumber = getRandomDoor(doorNumber);doorList.get(carDoorNumber).setBehind("Car");System.out.println("car:" + carDoorNumber);}private static void chooseDoor() {int chooseDoor = getRandomDoor(doorNumber);doorList.get(chooseDoor).setHasChoosed(true);System.out.println("choose:" + chooseDoor);}private static void openDoorWithoutCarBehind() {List<Door> doorsToOpen = new ArrayList<Door>();for (Door door : doorList) {if (door.isSheepBehind() && !door.hasChoosed) {doorsToOpen.add(door);}}doorsToOpen.get(getRandomDoor(doorsToOpen.size())).openDoor();System.out.println("open:" + doorsToOpen.get(getRandomDoor(doorsToOpen.size())).getDoorNumber());}private static void changeDoor() {for (Door door : doorList) {if (door.hasChoosed) {door.setHasChoosed(false);continue;}if (!door.hasChoosed && !door.hasOpened) {door.setHasChoosed(true);System.out.println("choose:" + door.getDoorNumber());}}}private static Boolean isWin() {for (Door door : doorList) {if (door.hasChoosed && door.isCarBehind()) {return true;}}return false;}public static void main(String[] args) {int beforeChangeWin = 0;int afterChangeWin = 0;for(int i = 0; i < 100000; i++) {init();setCar();chooseDoor();openDoorWithoutCarBehind();if(isWin()){beforeChangeWin ++;System.out.println("not Change Win");continue;}changeDoor();if(isWin()){afterChangeWin ++;System.out.println("change Win");}}System.out.println("===============");System.out.println("Not Change Win:" + beforeChangeWin);System.out.println("Change Win:" + afterChangeWin);}private static class Door {private String behind = "Sheep";private Boolean hasChoosed = false;private Boolean hasOpened = false;private int doorNumber;public Door(int doorNumber){this.doorNumber = doorNumber;}public boolean isSheepBehind() {return "Sheep".equals(behind);}public boolean isCarBehind() {return "Car".equals(behind);}public String getBehind() {return behind;}public void openDoor() {hasOpened = true;}public void setBehind(String behind) {this.behind = behind;}public Boolean getHasChoosed() {return hasChoosed;}public void setHasChoosed(Boolean hasChoosed) {this.hasChoosed = hasChoosed;}public int getDoorNumber() {return doorNumber;}public void setDoorNumber(int doorNumber) {this.doorNumber = doorNumber;}}
}

总结:以后思考问题,得多从面向对象去解决问题!

用编程去解决概率论问题相关推荐

  1. R语言ggplot2可视化对图形进行纹理填充实战及启示:遇到问题首先去思考有没有现成的包(ggpattern)可以去解决这个问题

    R语言ggplot2可视化对图形进行纹理填充实战及启示:遇到问题首先去思考有没有现成的包(ggpattern)可以去解决这个问题 目录

  2. firefox如何载入json文件_如何去解决JS跨域问题 怎么能学好Web前端开发

    如何去解决JS跨域问题?怎么能学好Web前端开发?JavaScript跨域是指通过JS在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过JS获取页面中不同域的框架中(if ...

  3. 寒霜朋克计算机丢失,寒霜朋克玩不了怎么办 寒霜朋克进不去解决方法

    寒霜朋克玩不了怎么办?不少玩家朋友们在进入游戏后会出现各种弹窗或运行不了问题,导致无法正常的游戏,下面我们就来分享 一下寒霜朋克进不去解决方法一览,希望对各位有所参考. 寒霜朋克进不去解决方法 1.下 ...

  4. 第五人格服务器维修中怎么进,第五人格进不去怎么办 游戏进不去解决方法详解[多图]...

    第五人格开启测试已经有一段时间,许多玩家都会遇到各种问题,其中游戏进不去是让玩家最头痛的,今天安族小编来给大家介绍一下游戏进不去解决方法详解. 第五人格进不去解决方法 大家在玩的时候,肯定都会遇到卡顿 ...

  5. 另辟蹊径:从其他角度去解决数据库问题

    墨墨导读:2020数据技术嘉年华于11月21日落下帷幕,大会历时两天,来自全国各地的数据领域学术精英.领袖人物.技术专家.从业者和技术爱好者相聚北京,见证了个人的快速成长.技术的迭代进步.行业的蓬勃发 ...

  6. 火线精英手游服务器维护,火线精英手机版登录失败进不去解决办法

    火线精英手机版登录失败进不去怎么办?火线精英手机版开测以来受到很多喜欢射击游戏的玩家喜爱,但是有玩家表示在游戏中遇到了登录失败进不去的情况,下面小编就为玩家们介绍一下火线精英手机版登录失败进不去的解决 ...

  7. 全民枪王服务器正在维护,《全民枪王》游戏黑屏怎么办? 游戏进不去解决方法...

    <全民枪王>游戏黑屏怎么办? 游戏进不去解决方法 http://www.7xz.com/qmqw/作者:7xz520 2015-09-15 15:56:56 全民枪王 8.2分精彩内容,尽 ...

  8. 南京 学计算机的学校,南京小学生暑假学计算机编程去哪家学校好

    南京小学生暑假学计算机编程去哪家学校好 南京小学生暑假学计算机编程去哪家学校好,推荐 南京童程童美专注于中国6-18岁青少儿编程教育的品牌.依托集团16年积累的互联网教育经验和百余名IT教研团队优势, ...

  9. 做自然语言的LSK 说要从哲学层面去解决语义分析问题

    http://www.ailab.cn/view/201605172793.html 按:做语义分析的工资雷锋网接触得不算少,但说要从"哲学层面"解决语义分析问题的,LSK是第一个 ...

最新文章

  1. Expression Blend 4 激活码
  2. Android左右连接和USING
  3. C++ 11 新特性 nullptr 学习
  4. 在vs2005中安装boost库
  5. 详述JavaScript数组
  6. 最坏情况为线性时间的选择算法
  7. 如何在 ASP.NET Core 中使用 ActionFilter
  8. list清空的函数java,6-1 jmu-Java-05集合-List中指定元素的删除 (20分)
  9. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction
  10. mysql unescape解码_python mysql escape\n(简单语法错误)
  11. 以写代学:python shutil模块
  12. web前端网页设计作业—个人网页(游戏主题)(html+css+js)
  13. html中video自动循环,HTML5视频自动循环播放方法
  14. #梆梆安全杯#个人对APP安全的一些看法
  15. KK 的99 条额外的建议[翻译]#yyds干货盘点#
  16. c语言流水灯程序详细讲解,用c语言编写单片机流水灯程序详解
  17. Schnorr技术详解
  18. 3DMAX使用心得(2007-9-9)
  19. 最全MySQL面试题和答案
  20. Altium Designer (AD)安装教程

热门文章

  1. 论强势文化的属性---来自心灵的呼唤
  2. 国内从事红外热成像的公司
  3. GetActiveWindow 这个函数是干嘛的
  4. 京东云与金山云合并!云计算行业真的要大洗牌吗?
  5. 三阶魔方七步还原法公式备忘录
  6. 轻松实现Android 更换皮肤(主题)
  7. asp.net Backup DataBase
  8. 持续集成:TeamCity 最详细的安装和使用介绍
  9. DevOps 3355
  10. java注解注入空,Spring4.3.7注解 @Autowired java.lang.NullPointerException