我有一点R情况,我无法理解。
据说这个代码只需要两行或三行
我要做的是弄清楚在看到每个数字之前我必须采取的10个变量样本。
换句话说,在我看到每一面之前需要多少卷骰子(在这种情况下有10面)
到目前为止,我还有这些方面的内容
param<-1:10
count<-0
seen<-0
for (i in 1:10) {
if (sample(param, size=1)==i);
if i in seen;
count+=1
seen+=1
elif count+=1
when seen==10 return(count)
}
但是这太长了,我也知道它的格式不正确(很确定我试图在某些时候使用python代码)但这是我第一次在R中做了一个循环。
非常感谢任何帮助!
是的,这是一个项目,但我想不出别的。 是的,我已经尝试过寻找其他问题/答案以寻求帮助,但我的大脑现在只是陷入困境答案 0 :(得分:3)
如果您正在寻找更短的代码:
set.seed(1984)
n = 10
param = 1:n
count = 0
while(length(param) != 0){ ## stop when all numbers are seen
param = setdiff(param, sample(1:n,1)) ## remove the element
count = count + 1
}
count
## 28
修改(略有矢量化的方法)
set.seed(1984)
n = 10
param = 1:n
count = 0
while(length(param) != 0){
count = count + length(param)
param = setdiff(param, sample(1:n,length(param),replace=T))
}
count
## 28
编辑2(多次运行)
set.seed(1984)
n = 10
num.runs = 5
count = rep(0,5)
for(i in 1:num.runs)
{
param = 1:n
while(length(param) != 0){
count[i] = count[i] + length(param)
param = setdiff(param, sample(1:n,length(param),replace=T))
}
}
count
## 28 24 23 30 23
答案 1 :(得分:3)
您可以通过故意过采样来解决此问题。在这个例子中,我创建了一个长度为1000的采样向量,然后使用sapply
来找到解决方案:
已修改,使用match
而不是sapply
,正如@MadScone所建议
set.seed(1984)
n <- 10
x <- sample(n, 1e3, replace=TRUE)
max(match(1:n, x))
[1] 28
如果您想重复体验,可以使用replicate
:
do_experiment = function() {
n <- 10
x <- sample(n, 1e3, replace=TRUE)
return(max(match(1:n, x)))
}
replicate(100, do_experiment())
[1] 28 26 26 15 30 14 29 18 35 24 24 35 42 20 29 18 18 38 14 22 26 26 22 29 31
[26] 51 14 35 26 19 40 22 23 19 28 15 27 20 16 18 20 19 18 37 24 38 37 54 29 19
[51] 22 22 14 17 33 22 35 15 32 23 35 27 22 18 30 31 38 36 26 31 43 27 23 21 40
[76] 25 36 21 39 27 55 28 36 15 48 31 32 46 28 21 40 23 46 24 31 30 25 21 24 20