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); } }
コメント