全プログラマーの10%は書いたであろうモンティホール問題のシミュレータ
モンティホール問題.js
// 0以上最大未満の整数をランダムで返す
function ランダム(最大) {
return Math.floor(Math.random() * 最大);
}
// 当たりがひとつだけ存在する3つのドアを返す
function ドア一覧生成() {
const 当たり = ランダム(3);
let i = 0;
return [
{ 当たりか: i++ === 当たり },
{ 当たりか: i++ === 当たり },
{ 当たりか: i++ === 当たり },
];
}
function 交換候補のドアを探す(ドア一覧, 選択ドア) {
if (選択ドア.当たりか) {
// 外れのドアのどちらかを返す
return ドア一覧.filter(ドア => !ドア.当たりか)[ランダム(2)];
}
else {
// 当たりのドアを返す
return ドア一覧.filter(ドア => ドア.当たりか)[0];
}
}
const 試行回数 = 10000;
let 交換しなかったときの当たり回数 = 0;
let 交換したときの当たり回数 = 0;
for (let i = 0; i < 試行回数; i++) {
const ドア一覧 = ドア一覧生成();
const 最初に選択したドア = ドア一覧[ランダム(3)];
// プログラム上、変数「交換候補のドア」を定義する意味は全くないが、
// モンティホール問題のストーリーが分かるようにするためだけに定義する。
const 交換候補のドア = 交換候補のドアを探す(ドア一覧, 最初に選択したドア);
if (最初に選択したドア.当たりか) {
交換しなかったときの当たり回数 += 1;
}
else if (交換候補のドア.当たりか) {
交換したときの当たり回数 += 1;
}
else {
throw new Error("ここが実行されることはありえない。");
}
}
console.log(`ドアを交換しなかった場合\t${交換しなかったときの当たり回数 / 試行回数}`);
console.log(`ドアを交換した場合\t${交換したときの当たり回数 / 試行回数}`);
結果
ドアを交換しなかった場合 0.3335
ドアを交換した場合 0.6665
これも読んでほしいな