我有以下四个数字集:
A=[1,207];
B=[208,386];
C=[387,486];
D=[487,586].
我需要在1到586之间生成20000个随机数,其中生成的数字属于A的概率是1/2,B,C,D是1/6。
我可以用哪种方式使用R?
答案 0 :(得分:15)
您可以直接使用sample
,更具体地说是probs
参数。只需将所有586个数字的概率除以。类别A
每个都会获得0.5/207
个权重等。
A <- 1:207
B <- 208:386
C <- 387:486
D <- 487:586
L <- sapply(list(A, B, C, D), length)
x <- sample(c(A, B, C, D),
size = 20000,
prob = rep(c(1/2, 1/6, 1/6, 1/6) / L, L),
replace = TRUE)
答案 1 :(得分:1)
我会说使用轮盘选择方法。我将尝试在这里做一个简短的解释。 拿一条长度为1的单位。现在按概率值的比例打破这个。所以在我们的例子中,第一件将是1.2长度,接下来的三件将是1/6长度。现在从均匀分布中采样0,1之间的数字。由于所有数字具有相同的发生概率,属于一块的采样数将等于该块的长度。因此,这个数字也属于哪个,从该向量中抽样。 (我会给你下面的R代码,你可以运行它来获取一个巨大的数字来检查我说的是不是真的。我可能没有在这里解释它。)
它被称为轮盘选择,因为对于相同情况的另一个类比可以是,取圆并将其分成扇区,其中每个扇区的角度与概率值成比例。现在再次从均匀分布中对一个数字进行采样,并查看它所属的扇区,并以相同的概率从该向量中采样
A <- 1:207
B <- 208:386
C <- 387:486
D <- 487:586
cumList <- list(A,B,C,D)
probVec <- c(1/2,1/6,1/6,1/6)
cumProbVec <- cumsum(probVec)
ret <- NULL
for( i in 1:20000){
rand <- runif(1)
whichVec <- which(rand < cumProbVec)[1]
ret <- c(ret,sample(cumList[[whichVec]],1))
}
#Testing the results
length(which(ret %in% A)) # Almost 1/2*20000 of the values
length(which(ret %in% B)) # Almost 1/6*20000 of the values
length(which(ret %in% C)) # Almost 1/6*20000 of the values
length(which(ret %in% D)) # Almost 1/6*20000 of the values