我正在使用 R 在统计课上模拟 Monty Hall 问题。问题的要点是有三扇门,一扇门后面是一个奖品。另外两个有山羊。玩家选择门后,游戏节目主持人会展示其中一扇包含山羊的门,并让玩家有机会改变原来的选择。我们应该通过 10000 次实验来证明,如果玩家换门,则有 2/3 的获胜机会;如果他们坚持最初的选择,则有 1/3 的机会获胜。
值得注意的是,我的教授希望我们随机化包含奖品的门和玩家最初选择的门,这就是我的问题出现的地方。
我已经成功完成了模拟,玩家坚持他们原来的选择。现在,我正在努力创建一个函数来确定游戏节目主持人展示的门,以便玩家可以做出新的选择,排除他们原来的选择和主持人展示的门。截至目前,这是我打开门的功能:
## Function to open a door
revealed_door = function(initial_choice, car_door, all_doors){
## if-else to determine which doors can be revealed and reveal one
ifelse(car_door == initial_choice, sample(setdiff(all_doors, initial_choice), 1),
setdiff(all_doors, c(initial_choice, car_door)))
}
car_door
是长度为10000的向量;每个元素都是按照1:3的比例随机抽取的。
initial_choice
是长度为10000的向量;每个元素都是按照1:3的比例随机抽取的。
all_doors
是长度为 3 的向量:c(1,2,3)。
当我稍后调用该函数时,出现以下错误:
sample.int(length(x), size, replacement, prob) 中的错误:第一个参数无效
我(显然)没有使用
sample.int
,所以我不确定为什么会出现这个错误。
此外,我尝试过:
,而不是我自己研究时看到的最常见的解决方案:
setdiff
我有时也遇到了以下错误,但我一辈子都不记得我做了什么来复制它:
只有 0 可以与负下标混合最后,在某个时刻,我设法消除了所有错误,但揭示向量填充了
ifelse(car_door == initial_choice, sample(all_doors[-initial_choice], 1),
all_doors[-c(initial_choice, car_door)])
值,所以显然结束概率最终为 0。这是我最近处理切换的代码块,以防有帮助:
NA
但是,我相信我的问题源于这样一个事实:我不知道如何在 switch_wins = 0
## Switch doors
reveal = revealed_door(initial_choice, car_door, all_doors)
new_choice = all_doors[-c(reveal, initial_choice)]
## Count wins
ifelse(car_door == new_choice, switch_wins + 1, switch_wins)
total_switch_wins = sum(switch_wins)
## Divide wins by n to calculate probability
switch_win_prob = total_switch_wins / 10000
print(switch_win_prob)
函数中迭代地使用
all_doors
从
initial_choice
中删除值,但这就是我在调试过程中所得到的。如果允许我保持
reveal_door
不变,我就不会遇到这个问题,因此我上面有评论。如有任何帮助,我们将不胜感激!
initial_choice