我已经在这里查看了我的问题的解决方案,但我没有看到。
在R中,我正在尝试模拟 Deal or No Deal 以获取让我们熟悉该软件的项目。我计划这是一个很大的循环,但我不能让我的第二个循环工作。我将它拆开以便于阅读(以及我的调试/测试)。
这个循环模拟了我们在整个游戏中保留的原始案例。
for(i in 1){
cases <- 1:26
originalpick <- sample(cases, 1, replace = FALSE) #choose a case
casesremaining <- (length(cases) - 1) #subtract original case from cases
}
这个循环模拟我们挑选的第一个案例。
for(i in 1){
casepicked <- replicate(1,sample(cases[-c(originalpick)], 1, replace = FALSE))
}
我的问题是我很可能会再次选择原来的案子。我使用样本因为我可以因为这个原因而关闭替换,因为那不起作用,我认为复制会有所帮助。我已经看到了更新功能,但我似乎也无法使用它。
这基本上就是游戏,因为我必须挑选案例,直到我留下2个案件(最初挑选案件和案件变量留下的案件)。
我还是R的新手,所以可能只是我对这些功能的误解?任何帮助将不胜感激!
答案 0 :(得分:2)
假设您想要模拟挑选案例的顺序,只需调用sample
(如果您想要执行多次模拟,则包含在replicate
中)即可完成此操作。
例如:
set.seed(1)
cases <- 1:26
picks <- sample(cases)
picks
## [1] 7 10 14 21 5 19 23 13 12 2 4 3 25 22 24 6 8 9 16 11 26 17 15 1 18 20
如果未提供其他参数,sample(x)
只会置换向量x
。上面,最初选择的案例是案例7,picks
的其余元素代表随后挑选的案例。
执行多项模拟:
picks3 <- replicate(3, sample(cases))
## [,1] [,2] [,3]
## [1,] 1 12 21
## [2,] 10 7 25
## [3,] 21 2 11
## [4,] 8 3 17
## [5,] 11 25 9
## [6,] 13 11 7
## [7,] 25 14 16
## [8,] 4 8 4
## [9,] 15 17 13
## [10,] 12 5 3
## [11,] 24 19 19
## [12,] 2 18 23
## [13,] 22 10 20
## [14,] 6 4 1
## [15,] 20 6 8
## [16,] 23 9 10
## [17,] 14 1 12
## [18,] 5 16 24
## [19,] 9 23 14
## [20,] 16 26 15
## [21,] 26 21 5
## [22,] 3 24 22
## [23,] 17 15 26
## [24,] 19 22 2
## [25,] 7 13 18
## [26,] 18 20 6
现在,每列都是选择顺序的独立模拟。
有兴趣的是,要使用for
循环一次模拟一个选择(例如,如果您想在此过程中插入其他步骤),您可以执行以下操作(尽管有很多方法可以做它):
picks <- sample(cases, 1) # original pick
for (i in 2:length(cases)) { # subsequent picks
remaining <- setdiff(cases, picks)
picks[i] <- remaining[sample(length(remaining), 1)]
}
注意:我们使用的是remaining[sample(length(remaining), 1)]
而不是sample(remaining, 1)
,因为在最后一次迭代中,remaining
将是一个数字(最后一个案例的数量)。传递单个号码,例如4,sample
导致sample(1:4, 1)
而非sample(4, 1)
。有关详情,请参阅this post。