全プログラマーの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
これも読んでほしいな