Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@Kashiwara

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

More than 3 years have passed since last update.

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
なので、近い値になっている事がわかるかと思います。

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

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Kashiwara
nimとtsが好きです よろしくお願いします
sportsfield
人材支援会社、株式会社スポーツフィールドのIT・WEB開発部門

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?