月別アーカイブ: 2017年4月

モンティ・ホール問題をプログラムで結果だけ出す

ここではモンティ・ホール問題をプログラムによって結果だけ出してしまおうと思う。

モンティ・ホール問題

モンティ・ホール問題 – Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C

PHPが動かない方のためのデモ
http://office-goto.info/demo/monty-hall-problem/index.php
※F5アタックでボクのサーバーを落とさないでくれよ!

ソース

<?php

    $totalWin = 0;
    $totalLoose = 0;
    $doorFlg = 0;
    for ($i = 0; $i < 100; $i++) {
        $jackpot = rand(0,2);
        $select = rand(0,2);
        $openLoose = getOpenLoose($select, $jackpot);

        // 選び直さない
        if ($doorFlg == 0) {
            if ($select == $jackpot) {
                $totalWin++;
            }
            else {
                $totalLoose++;
            }
            if ($i == 99) {
                $doorFlg = 1;
                $i = 0;
                echo "ドアを選びなおさなかった場合<br>";
                echo "Win:{$totalWin}<br>";
                echo "Loose:{$totalLoose}<br><br>";
                $totalWin = 0;
                $totalLoose = 0;
            }
        }

        // 選び直す
        if ($doorFlg == 1) {
            $array = array(0,1,2);
            unset($array[$select]);
            unset($array[$openLoose]);
            $array = array_values($array);
            if ($array[0] == $jackpot) {
                $totalWin++;
            }
            else {
                $totalLoose++;
            }
            if ($i == 99) {
                echo "ドアを選びなおした場合<br>";
                echo "Win:{$totalWin}<br>";
                echo "Loose:{$totalLoose}<br>";
                exit;
            }
        }

    } // endfor

    function getOpenLoose($select, $jackpot) {
        $arrLoose = array(0,1,2);
        unset($arrLoose[$jackpot]);
        unset($arrLoose[$select]);
        $arrLoose = array_values($arrLoose);

        if ($select == $jackpot) {
           $rand = rand(0,1);
           return $arrLoose[$rand];
        }
        else {
           return $arrLoose[0];
        }
    }

プログラム解説と結論

100回ドアを選びなおさなかった場合とドアを選びなおした場合の当りとハズレの回数を出しています。
ドアを選びなおしたほうが当りの確立はあがりました。

実際に100回やるところだったよ、プログラムって便利!

実際、問題だったから筆者は分かったけどいきなりLet’s make a dealのゲストとして呼ばれたならドアを選びなおさなかったかもね!
つまり問題として出されたことに引っかかったわけだ。

納得できない人はドア3枚と新車を購入してヤギを2匹育てて100回試してみるといいよ!