2014-05-02 27 views
0

我試圖以遞增順序的範圍(1-3)內產生的4個隨機整數的向量v,爲此,我想出這種方法:R值不要做樣品正確

v<-1:4 
v[1]<-sample(1:3,1) 
for (i in 2:4) v[i]<-sample(v[i-1]:3,1) 

編輯:由於出現了混亂,我會清理這就是我想要爲載體將是一個數學集合,所以我基本上是想通過使用3種不同的元素,可以得到隨機集形成基數4(顯然必須)重複。

但問題是,設置如{1,1,1,1}有出現的一個方式,而像集合{1,2,3,3}可以在12種不同的方式(顯示爲,在數學集合,順序無關緊要),所以我將有12倍的概率出現其中的一個。我正在尋找一種隨機獲取其中一套的方法,它們都具有相同的出現概率。我應該張貼工作,如果不是因爲這個問題

出於某種原因,不過,它不工作。我已經想通了,當它到達範圍的頂部,它攪亂了,開始以爲在範圍內的所有整數都是可能再次,而在現實中孤單隻有一種可能離開。

即,只要它在我的具體問題達到3,應該是執行:

sample(3:3,1) 

應該始終導致3.相反,似乎在執行

sample(1:3,1) 

有沒有解決這個問題的方法?

+0

也許我不明白你要做什麼;有沒有什麼原因,你不只是產生一個隨機整數向量,然後整理它們? – tkmckenzie

+2

read'?sample'; 'sample(1:3,4,replace = TRUE)';然後排序 – rawr

+2

此外,這是因爲3:3返回標量3,並且當一個標量傳遞給sample時,使用sample.int,所以你真的得到sample.int(3,1),這是等價的採樣(1:3,1)。 – tkmckenzie

回答

2

這是有點麻煩,但你可以定義一個並非默認時標被作爲參數傳遞給sample.int備用樣品功能:

sample.alt = function(x) ifelse(length(x)>1, sample(x, 1), x) 

和使用,而不是樣品。

編輯:很高興幫助@LMartin。我不得不提前參加一個研討會,所以我沒有使這個功能完全健壯。理想情況下,這個函數應該具有與樣本相同的選項;不幸的是,ifelse返回一個矢量相同的長度傳遞給它的邏輯論證,這是方便與向量,但不是很大了這個問題:

> x = 1:10 
> ifelse(length(x)>1, x, 0) 
[1] 1 

所以我們只是做了很長的路要走:

sample.alt = function(x, size, replace = FALSE, prob = NULL){ 
    if (length(x) > 1){ 
    sample(x, size, replace, prob) 
    } 
    else{ 
    rep(x, size) 
    } 
} 
+0

謝謝@tkmckenzie,這就是我一直在尋找;) –

1

這裏是思考這個問題的不同方式。簡而言之,生成所有可能的有效序列,刪除重複項,然後對唯一序列集進行採樣。

> set.seed(1) 
> x <- unique(t(apply(expand.grid(1:3,1:3,1:3,1:3),1,sort)),MARGIN=1) 
> x 
     [,1] [,2] [,3] [,4] 
[1,] 1 1 1 1 
[2,] 1 1 1 2 
[3,] 1 1 1 3 
[4,] 1 1 2 2 
[5,] 1 1 2 3 
[6,] 1 1 3 3 
[7,] 1 2 2 2 
[8,] 1 2 2 3 
[9,] 1 2 3 3 
[10,] 1 3 3 3 
[11,] 2 2 2 2 
[12,] 2 2 2 3 
[13,] 2 2 3 3 
[14,] 2 3 3 3 
[15,] 3 3 3 3 
> x[sample(1:nrow(x),1),] 
[1] 1 1 2 2 
+0

哦,這也是一個非常有趣的方式來解決這個問題,它也展示瞭如何產生所有的可能性,謝謝托馬斯。 –