问题是,如果顺序很重要,那么您需要排列而不是组合。排列通常会迅速爆发并变得难以管理。我敢肯定这效率极低,但它似乎有效。
balls<-c(rep("R",3), rep("G",2),"W")
permn <- function(x, n) {
if (n<1) return(vector(class(x)))
do.call(rbind, lapply(1:length(x), function(i) {
cbind(x[i], permn(x[-i], n-1))
})
)
}
x <- permn(balls, 3)
unique(sort(apply(x, 1, paste, collapse="")))
它返回
[1] "GGR" "GGW" "GRG" "GRR" "GRW" "GWG" "GWR" "RGG" "RGR" "RGW" "RRG"
[12] "RRR" "RRW" "RWG" "RWR" "WGG" "WGR" "WRG" "WRR"
如预期的。
该permn
函数以递归方式工作。您传入一个值列表 ( x
) 以及要从该列表中选择的项目数 ( n
)。如果您选择了至少一个值,那么我们会设置一个循环来选择每个元素。然后,在我们选择了一个值之后,我们需要n-1
从剩余的项目中选择更多。所以我们再次调用该函数,这次删除我们刚刚选择的值并减少我们需要选择的项目的数量。
到目前为止,我们实际上一直在忽略集合中的值(我们假设它们都是唯一的)。但是由于在这种情况下,某种颜色的所有球都无法区分,我们需要折叠我们的结果。由于permn
实际返回一个矩阵,我们将行从一个向量折叠c("G","G","R")
到字符串"GGR"
,然后只取唯一值。
当然,并不是每一个结果都是同样可能的。如果我们想知道它们发生的频率,你可以这样做
sort(prop.table(table(apply(x, 1, paste, collapse=""))))
这还将计算样本空间中每个元素的概率
GGW GWG WGG GGR GRG GRW
0.01666667 0.01666667 0.01666667 0.05000000 0.05000000 0.05000000
GWR RGG RGW RRR RRW RWG
0.05000000 0.05000000 0.05000000 0.05000000 0.05000000 0.05000000
RWR WGR WRG WRR GRR RGR
0.05000000 0.05000000 0.05000000 0.05000000 0.10000000 0.10000000
RRG
0.10000000