事情是,如果訂單很重要,那麼你想排列而不是組合。排列通常迅速爆炸並變得難以管理。我相信這是非常低效的,但它似乎工作。
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
這將從正確的分佈繪製每個元素的概率,但它不一定會根據請求生成樣本空間。 (除非你多次運行它,並採取觀察到的獨特的價值,但停止短暫的無窮大有可能會錯過一次)。 – MrFlick 2014-09-05 19:24:23
@MrFlick - 哦,好點 - 沒有完全解決問題。很遺憾,現在沒時間去試試吧 - 期待其他答案 – jalapic 2014-09-05 19:28:05
謝謝你的努力! – 2014-09-07 08:10:11