蒙提霍尔问题java模拟

参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。
当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。
主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:你是否会重选?为什么?

package demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/** 
* @author 苏一叶 E-mail:by.su@qq.com 
* @version 创建时间: 2017年2月7日13:39:14
*/ 

public class MotyHall {
/**
 * 1.先设置随机奖品摆放
 * 2.设置随机的选择
 * 3.支持人确定是否选中,然后打开不对的选项
 * 4.不重选,是否正确;重选是否正确
 * 5.模拟20万次,计算并统计结果
 */
	public static void main(String[] args) {
		
		int right = 0;//对的次数
		int wrong = 0;//错的次数
		boolean yes = false;//true为重选,false为不重选
		
		for(int i=0;i<200000;i++){
			ArrayList JPResult = (ArrayList)setJP();
			Collections.shuffle(JPResult);//让奖品随机
			String chooseResult = (String)JPResult.get(setChoose());//随机结果
			if(chooseResult.equals("a")){//如果选中的是对的
				if(yes == true){//重选,那就是一定是错的
					wrong ++;
				}else{
					right ++;
				}
			}else{//如果选择的是错的
				if(yes == true){//重选之后,肯定是对的
					right ++;
				}else{//不重选,那么就是错的
					wrong ++;
				}
			}
		}
		System.out.println("yes默认为false时,right = " + right);
		System.out.println("yes默认为false时,wrong = " + wrong);
	}
	
	//随机选
	public static int setChoose(){
		return new Random().nextInt(3);
	}
	
	//设置奖品,a是对,b是错
	public static List setJP(){
		ArrayList<String> map = new ArrayList<>();
		map.add("a");
		map.add("b");
		map.add("b");
		return map;
	}

}

yes为false,也就是不重选的模拟结果:

yes默认为false时,right = 66528
yes默认为false时,wrong = 133472

故此:重选中的概率是三分之二的分析没毛病。^_^

以上不考虑算法最优。有好的算法,还请多多指教。谢谢

转载于:https://my.oschina.net/bysu/blog/833267

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值