LoginSignup
0
1

【JavaScript】モンティホール問題

Last updated at Posted at 2023-11-09

全プログラマーの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

これも読んでほしいな

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1