4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

rubyでモンティホール問題に挑戦

Last updated at Posted at 2018-04-08

#rubyでモンティホール問題に挑戦

##環境
ruby 2.4.1
##概要
プログラミングのための確立統計という本を読んでいたらモンティホール問題の話が出てきました。なので組んでみます。

モンティホール問題って何?

3つの扉とヤギと車で構成されるゲームです。
詳しくはここから

ソースコード

今回作成したソースコードを置いておきます。
試行回数は10000に設定してあります。

モンティホールプログラム
# 新たにモンティホール問題をセットするメソッド
def set_monty_hall_problem
    monty_hall_problem = Array.new(3).map{|t| "Goat" }
    correct_door_num = rand 3
    monty_hall_problem[correct_door_num] = "Car"

    return monty_hall_problem, correct_door_num
end

# その扉が正解かどうかを返却するメソッド
def correct_door? correct_door_num, open_door_num
    correct_door_num == open_door_num
end

# 扉を開示するメソッド
def open_goat_door correct_door_num, open_door_num
    goat_door_num =
        if correct_door? correct_door_num, open_door_num
            # 正解の場合、不正解のドアをどちらか開示
            [*(0..2)].select{|t| t != open_door_num}.sample
        else
            # 不正解の場合、もう片方の不正解のドアを開く
            [*(0..2)].select{|t| t != correct_door_num && t != open_door_num}[0]
        end
end

# 確率に変換してくれるメソッド
def change_probability sum, occurrence_num
   probability = (occurrence_num.to_f / sum.to_f) * 100
end

# モンティホール問題をプレイするメソッド
def play_monty_hall_problem trials_num
    not_change_door_count = 0

    trials_num.times do 
        # モンティホール問題と正解の扉番号を取得
        monty_hall_problem, correct_door_num = set_monty_hall_problem
        # 開けるドアをランダムに選択する
        open_door_num = rand 3
        # ヤギがいるドアの番号を取得
        goat_door_num = open_goat_door correct_door_num, open_door_num
        # 扉を変更しない場合
        not_change_door_count += 1 if correct_door? correct_door_num, open_door_num

    end
    not_change_door_probability = change_probability trials_num, not_change_door_count
    change_door_probability = 100 - not_change_door_probability
    puts "扉を変更しないで車が当たった確率:#{not_change_door_probability}%"
    puts "扉を変更して車が当たった確率:#{change_door_probability}%"

end

play_monty_hall_problem 10000

###結果
上記のソースコードを実行した結果を下記に記します。

結果
扉を変更しないで車が当たった確率:33.33%
扉を変更して車が当たった確率:66.67%

それぞれの理論値は、
扉を変更しないで車が当たった場合が1/3
扉を変更して車が当たった場合が2/3
なので、近い値になっている事がわかるかと思います。

本を読むだけじゃ手に入れられない実感を得られたので今後もこのように検証していきたいと思います。

4
2
0

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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?