﻿rm(list = ls())  # ワークスペースをクリア
n <- 100000  # 試行回数
k <- 3  # 扉の枚数 (k枚の扉は1,2,...,kと表す)
n_sw <- 0  # スイッチしたときの当選回数
set.seed(1)  # 乱数のシード値を固定
for (i in 1:n) {
  true_prize <- sample(1:k, 1)  # 商品が隠された扉
  original_choice <- sample(1:k, 1)  # 挑戦者が最初に選ぶ扉
  index_vec <- c(1:k)
  # 挑戦者が最初に当たりを選んだ場合
  if (original_choice == true_prize) {
    # index_vec(k次元)からoriginal_choiceを除く
    index_vec <- setdiff(index_vec, original_choice) 
    # index_vec((k-1)次元)の中から無作為に1つを選ぶ 
    unopened_vec <- sample(index_vec, 1)
    # unopened_vec = 閉めたままの2つの扉
    unopened_vec <- c(unopened_vec, original_choice)  
  } else {  # 挑戦者が最初にはずれを選んだ場合
    # unopened_vec = 最初に選んだ扉と当たりの扉
    unopened_vec <- c(original_choice, true_prize)  
  }
  # スイッチした後の扉
  the_other_unopened <- setdiff(unopened_vec, original_choice)  
  # スイッチした後の扉が当たり
  if (the_other_unopened == true_prize) { 
    n_sw <- n_sw + 1
  }
}
# スイッチして当選する確率を表示
n_sw / n  # モンテカルロ法
(k-1) / k  # 参考：理論値