使用R在给定概率下生成两个值之间的随机整数

时间:2013-06-08 17:00:37

标签: r random

我有以下四个数字集:

A=[1,207];
B=[208,386];
C=[387,486];
D=[487,586].

我需要在1到586之间生成20000个随机数,其中生成的数字属于A的概率是1/2,B,C,D是1/6。

我可以用哪种方式使用R?

2 个答案:

答案 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