2014-09-05 3 views
1

Я столкнулся с этим упражнением, которое не могло решить: Урна содержит три красных шарика, два зеленых шарика и один белый. Три шарика вырисовываются последовательно без замены из урны. Их цвета записываются. Список образец пространство, используя 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"} 

ответ

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" 
+2

Это потянет от правильного распределения, но он не обязательно будет генерировать пространство выборки по запросу. (Если вы не запускаете его много, много раз и не берете уникальные значения, наблюдаемые, но останавливаясь до бесконечности, есть шанс, что вы пропустите один). – MrFlick

+0

@MrFlick - о, хорошая точка - не совсем вопрос. К сожалению нет времени прямо сейчас, чтобы поехать на него - с нетерпением ждем других ответов – jalapic

+0

Спасибо за попытку! –

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" 

по желанию.

Функция работает рекурсивно. Вы передаете список значений (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 
+0

Спасибо, мистер Флик! Пожалуйста, не беспокойтесь, что это неэффективно. Я потрачу весь день на то, как эта функция будет работать. –

+0

@ Катерина Бакунина Надеюсь, это не сложно понять, как это работает. Я добавил дальнейшее описание к ответу, надеюсь, сделать его еще проще. – MrFlick