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