作成者別アーカイブ: 後藤 祐一

後藤 祐一 について

フリーランスとしてWebプログラミングを行っています。
宜しくお願いします。

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

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

モンティ・ホール問題

モンティ・ホール問題 – 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回試してみるといいよ!

Google Maps API V3 逆ジオコーディング

ここではGoogle Maps API V3 緯度経度から逆ジオコーディングする方法を解説しています。

GoogleMap

デモはこちら
http://office-goto.info/demo/reverse-geocoding/

サンプルソース

google.maps.event.addDomListener(window, 'load', function() {
    var latlng = new google.maps.LatLng(35.671277, 139.718489);
    var options = {
        zoom: 16,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("gmap"), options);

    // InfoWindowオブジェクト
    var infowindow = new google.maps.InfoWindow();

    $("input[type=button]").click(function () {
        var geocoder = new google.maps.Geocoder();
        // 入力された緯度経度取得
        latlng = new google.maps.LatLng($("#lat").val(), $("#lng").val());
        // 逆ジオコーディング
        geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                // マップのセンターを入力された緯度経度に設定
                map.setCenter(latlng);
                // 入力された緯度経度にMarker設定
                var marker = new google.maps.Marker({
                    map: map,
                    position: latlng
                });
                // 入力された緯度経度にInfoWindow
                google.maps.event.addListener(marker, 'click', function (e) {
                    // 緯度経度から逆ジオコーディングした住所を表示
                    infowindow.setContent(results[0].formatted_address);
                    infowindow.open(map, marker);
                });
            }
            else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        });
    });
});

サンプルソースの例では緯度経度を入力して、入力された緯度経度をもとに、逆ジオコーディングして住所を取得しInfoWindowに表示しています。

Google Maps API V3 ジオコーディング

ここではGoogle Maps API V3 住所からジオコーディングする方法を解説しています。

GoogleMap

デモはこちら
http://office-goto.info/demo/geocoding/

サンプルソース

google.maps.event.addDomListener(window, 'load', function() {
    var latlng = new google.maps.LatLng(35.671277, 139.718489);
    var options = {
        zoom: 16,
        center: latlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("gmap"), options);

    // InfoWindowオブジェクト
    var infowindow = new google.maps.InfoWindow();

    // Markerオブジェクト
    var marker = new google.maps.Marker({
        position: latlng,
        map: map
    });

    // マーカクリック時
    google.maps.event.addListener(marker, 'click', function (e) {
        infowindow.setContent('Hello World');
        infowindow.open(map, marker);
    });

    $("input[type=button]").click(function () {
        var geocoder = new google.maps.Geocoder();
        var address = $("#address").val();
        geocoder.geocode( { 'address': address}, function(results, status) {
            var location = results[0].geometry.location;
            if (status == google.maps.GeocoderStatus.OK) {
                // マップのセンターを入力された住所に設定
                map.setCenter(location);
                // 入力された住所にMarker設定
                var marker = new google.maps.Marker({
                    map: map,
                    position: location
                });
                // 入力された住所にInfoWindow
                google.maps.event.addListener(marker, 'click', function (e) {
                    infowindow.setContent("Lat:" + String(location.lat()) + "<br>Lng:" + String(location.lng()));
                    infowindow.open(map, marker);
                });
            }
            else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        });
    });
});

サンプルソースの例ではTextフィールドに住所を入力して入力された住所から緯度経度を取得し、マップを移動してMarkerとInfoWindowを設定しています。