Симуляция Монте-Карло в R для проблемы Монти Холла не работает? - PullRequest
4 голосов
/ 12 мая 2019

Я пишу функцию в R для выполнения симуляции Монте-Карло для задачи Монти Холла. Функция работает, когда двери не переключаются, это switch == FALSE, но когда я звоню mean(replicate(10000, monty_hall(switch = TRUE))), ожидаемый ответ составляет примерно 0.66, но я на самом деле обхожу 0.25.

Вот код функции:

monty_hall = function(switch = logical()){
    doors <- c(1,2,3)
    names(doors) <- rep(c("goat", "car"), c(2,1))
    prize_door <- doors[3]

    guess <- sample(doors, 1)
    revealed_door <- sample(doors[!doors %in% c(guess, prize_door)],1)
    if(switch){
        switched_door <- sample(doors[!doors %in% c(guess, revealed_door)],1)
        prize_door == switched_door
    } else {
        prize_door == guess
        }
}

Какие изменения я должен сделать, чтобы получить правильный вывод, который составляет около 0.66?

1 Ответ

5 голосов
/ 12 мая 2019

Просто измените вектор дверей на символы

monty_hall = function(switch = logical()){
   doors <- c("1","2","3")
   names(doors) <- rep(c("goat", "car"), c(2,1))
   prize_door <- doors[3]

   guess <- sample(doors, 1)
   revealed_door <- sample(doors[!doors %in% c(guess, prize_door)],1)
   if(switch){
      switched_door <- sample(doors[!doors %in% c(guess, revealed_door)],1)
      prize_door == switched_door
   } else {
      prize_door == guess
   }
}

Предположим, что человек выбрал дверь № 1, а приз - в двери № 2, так что осталось открыть дверь № 3.

У вас будет revealed_door <- sample(3,1), и это не сработает, как вы ожидаете, это станет revealed_door <- sample(c(1,2,3),1)

Из документации по функции просто наберите ?sample

Если x имеет длину 1, является числовым (в смысле is.numeric) и x> = 1, выборка через образец происходит от 1: x. Обратите внимание, что это удобство функция может привести к нежелательному поведению, когда х имеет разную длину в вызовы, такие как sample (x)

Я думаю, что самое простое исправление - это изменение символов, но если вам нужно использовать числовые значения, просто проверьте длину вектора и верните значение, если оно равно 1, или выполните выборку в противном случае

...