我想从替换的矢量中随机抽取5个数字:
myvector <- c(1:50)
draws <- sample(myvector,5,replace=F)
但是,想要包含一些限制。
排除1:我不想一起画10和11
排除2:我只想拥有一个以下内容:17,18,19,20。
但是在算法开始之前,每个数字应该具有相同的概率。到目前为止,我的想法违反了这一条件:为排除分配相同的数字并从中抽取:
myvector.wrong <- c(1:9,10,12:17,21:50)
draws.wrong <- sample(myvector.wrong,5,replace=F)
#say we draw a 17:
draws.wrong[1] <- 17
#then replace the 17 with a randomly drawn number from c(17:20)
draws.wrong[draws.wrong==17] <- sample(c(17:20),1)
然而,这意味着c(17:20)中的每个数字现在只有四分之一的机会被绘制而不受限制。我只希望一旦抽出一定数量的排除,就有机会减少(减少到0)。我可以包括17次,但后来我冒两次冒险,这正是我想要避免的。
迭代地,这将更容易:在每次抽奖之后检查是否绘制了任何排除数字(例如10)并在再次绘制之前删除相应的排除数字(10和11)。但是,我会执行很多(通常50k,有时是500k)重复此过程,因此效率是一个问题。
任何参赛者?
答案 0 :(得分:1)
创建一个函数来检查您的条件是否得到满足并进行采样,直到获得可以使用的向量
check = function(x){
if (sum(10:11 %in% x) > 1){
return(FALSE)
}
if (sum(17:20 %in% x) > 1){
return(FALSE)
}
return(TRUE)
}
a = 10:11
while(check(a) == FALSE){
a = sample(1:50, 5, replace = FALSE)
}