2

我遇到了这个无法解决的练习:一个骨灰盒包含三个红球、两个绿球和一个白球。三个球从瓮中依次抽出,无需更换。他们的颜色被记录下来。使用 R 列出样本空间。

我试过了:

combn(c(rep("R",3), rep("G",2),"W"),3)

但是这个函数没有考虑元素的顺序,而是读取三个 R,如 R1、R2 和 R3。结果,输出中有重复的行。

我需要生成这个序列的函数:

Ω = {"GGR" "GGW" "GRG" "GRR" "GRW" "GWG" "GWR" "RGG" "RGR" "RGW" "RRG" "RRR" "RRW" "RWG" "RWR" "WGG" "WGR" "WRG" "WRR"}
4

3 回答 3

3

问题是,如果顺序很重要,那么您需要排列而不是组合。排列通常会迅速爆发并变得难以管理。我敢肯定这效率极低,但它似乎有效。

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 
于 2014-09-05T19:21:39.790 回答
0

你可以这样做:

balls<-c(rep("R",3), rep("G",2),"W")
paste(sample(balls,3), collapse="")  #this collapses your output so rather
                                     # than "G" "G" "W", it comes back as:

#[1] "GGW"

做 10 次

replicate(10, (paste(sample(balls,3), collapse="") ))

# [1] "RGW" "RWR" "RGR" "WRG" "RRW" "RRW" "RWR" "RGG" "GRR" "RRR"
于 2014-09-05T19:05:59.807 回答
0

您还可以像这样使用包中的urnsamples函数prob

unique(urnsamples(x, size = 3, replace = F, ordered = T))

“prob”包中有几个样本空间和概率函数:

https://cran.r-project.org/web/packages/prob/vignettes/prob.pdf

您可以使用以下代码调出此包的 pdf 文件:

小插图(“问题”)

于 2020-05-27T16:28:37.447 回答