3つの扉があり、その一つにお宝が隠れている。クイズ番組などでおなじみの光景だ。
今回はこのお題からの出題。

Q1
3つの扉のどれか一つにお宝が隠されている。(ランダム)

最初に扉を選ぶ。
すると司会者が残りの2つの扉をこっそりと調べ、宝がない扉を一つ開けてくれる。

その情報をもとに扉を選び直す。

めでたくお宝を当てられれば
「おめでとうございます!お宝GETです!!」
はずれれば
「残念、ハズレです。」
と出力するプログラムを作成せよ。

[実行例]

3つの扉のうちどれか一つの扉の向こうにお宝があります
0,1,2どの扉を選びますか(0,1,2)>1
1番の扉をお選びですね。
私が残りの扉の中をこっそり見てきます...
0番の扉の後ろには何もありません!
ここで改めてお聞きします、何番の扉を選びますか(0,1,2)>2
おめでとうございます!お宝GETです!!
import java.util.Random;
import java.util.Scanner;

public class Monty {
	public static void main(String[] args){
		Random rand=new Random();
		Scanner scan=new Scanner(System.in);
		boolean[] hasTreasure=new boolean[3];
		int luckyNo=rand.nextInt(3);
		hasTreasure[luckyNo]=true;
		System.out.println("3つの扉のうちどれか一つの扉の向こうにお宝があります");
		System.out.print("0,1,2どの扉を選びますか(0,1,2)>");
		int choice=scan.nextInt();
		System.out.printf("%d番の扉をお選びですね。%n", choice);
		System.out.println("私が残りの扉の中をこっそり見てきます...");
		int diff=rand.nextInt(2)+1;
		int emptyIndex=hasTreasure[(choice+diff)%3] ? (choice+(diff==1? 2:1))%3:(choice+diff)%3;
		System.out.printf("%d番の扉の後ろには何もありません!%n",emptyIndex);
		System.out.print("ここで改めてお聞きします、何番の扉を選びますか(0,1,2)>");
		choice=scan.nextInt();
		String msg=hasTreasure[choice] ? "おめでとうございます!お宝GETです!!":"残念、ハズレです。";
		System.out.println(msg);
	}
}

Q2
このルールの場合、確立的に最初の選択を変えたほうが得なのかそれとも同じなのか
それぞれ,10000回ほど試行して考察せよ。

import java.util.Random;
import java.util.Scanner;

public class Monty2 {

	public static void main(String[] args) {
		Random rand=new Random();
		Scanner scan=new Scanner(System.in);
		
		final int TOTAL_COUNT=10000;
		System.out.print("選択を変えない場合のあたり回数:");
		int luckyCount=0;
		for(int i=0;i<TOTAL_COUNT;i++){
			boolean[] hasTreasure=new boolean[3];
			int luckyNo=rand.nextInt(3);
			hasTreasure[luckyNo]=true;
			int choice=0;//最初にどこを選ぶかは確率に影響しないので常に0
			if(hasTreasure[choice]){
				luckyCount++;
			}
		}
		System.out.println(luckyCount);
		
		System.out.print("選択を変えた場合のあたり回数:");
		luckyCount=0;
		for(int i=0;i<TOTAL_COUNT;i++){
			
			boolean[] hasTreasure=new boolean[3];
			int luckyNo=rand.nextInt(3);
			hasTreasure[luckyNo]=true;
			int choice=0;
			int diff=rand.nextInt(2)+1;
			int emptyIndex=hasTreasure[(choice+diff)%3] ? (choice+(diff==1? 2:1))%3:(choice+diff)%3;
			if(hasTreasure[emptyIndex==1 ? 2:1]){
				luckyCount++;
			}
		}
		System.out.println(luckyCount);	
	}
}