2017-03-16 42 views
1

我想隨機向量畫5個號碼與替換隨機得出:與排除限制

myvector <- c(1:50) 
draws <- sample(myvector,5,replace=F) 

然而,要包括一些限制。

排除1:我不想畫兩個10和11一起

排除2:我只希望有以下一個:17,18,19,20。

但每個號碼應該具有相同的概率算法開始之前繪製。我的想法而已違反這個條件:分配相同數量的排除和從中得出:

myvector.wrong <- c(1:9,10,12:17,21:50) 
draws.wrong <- sample(myvector.wrong,5,replace=F) 
#say we draw a 17: 
draws.wrong[1] <- 17 
#then replace the 17 with a randomly drawn number from c(17:20) 
draws.wrong[draws.wrong==17] <- sample(c(17:20),1) 

然而,這意味着,在C每個號碼(17:20)只具有偶然性的四分之一到與沒有限制的數字相比較。我只希望這樣的機會減少(0)一旦排除一個數量已經繪有相同的機會,因爲任何其他。我可以包括17次四次,但後來我冒了兩次,這正是我想要避免的。

迭代,這將是更容易:每個後得出檢查是否有任何的排除號碼的繪製(如10),並再次在繪圖之前刪除相應的排除數字(10和11)。不過,我會開展了大量(50K通常,有時500K)本工序的重複這樣的效率是一個問題。

贊成嗎?

回答

1

創建一個函數來檢查你的條件得到滿足和樣品,直到你得到你可以使用

check = function(x){ 
    if (sum(10:11 %in% x) > 1){ 
     return(FALSE) 
    } 
    if (sum(17:20 %in% x) > 1){ 
     return(FALSE) 
    } 
    return(TRUE) 
} 

a = 10:11 
while(check(a) == FALSE){   
    a = sample(1:50, 5, replace = FALSE) 
} 
+1

感謝您的回答載體!我也考慮過這個問題,但效率不高,因爲我會畫出一些我將再次丟棄的組合。另外,R不應該是循環緩慢?雖然我真的很喜歡這個想法! –

+1

50-500k在不同的運行。 –

+1

@PeterPan,這是一個很好的問題。儘管如此,我想不出更快的解決方案。祝你好運! –