2016-01-13 71 views
4

從整數1,...,N我想採取k個隨機的不同組合,不需要重複大小p。例如,如果N=10k=4p=3,一個可能的結果將是:k大小p的獨特組合,無需替換

1 4 9 
9 4 2 
3 5 2 
1 8 4 

但不是:

1 4 9 
9 4 2 
3 5 3 
1 9 4 

有兩個原因:

  1. [1 4 9][1 9 4]是相同的組合。

  2. [3 5 3]並非沒有重複。

請注意,獲取所有可能的組合和(隨機)挑選k它們很容易遇到內存問題。

+0

我編輯這些前兩個單詞的原因是因爲它包含在標記中。這就是標籤的用途。其次:至少把它寫成「MATLAB」,就像MathWorks所稱的程序一樣,如果你堅持把它保留在那裏的話。 – Adriaan

+0

是的,我的經驗是,即使它是在標籤中,明確寫出Matlab,或者如你所願的MATLAB,使人們更加意識到它。這就是爲什麼我把它放回去。我不知道這是一種犯罪,看到別人再次拿走它...... – Eric12345

+1

這不是犯罪,它只是多餘的。人們通常通過語言標籤進行瀏覽,因此通過MATLAB標籤結束了這個問題。 SO傾向於儘量保持其問題的簡短和重點,以便將來的用戶儘可能快地找到所需的信息;這也是我編輯第一段的原因。安德爾再次編輯它的原因可能是因爲儘管將語言名稱放在那裏並不是很不尋常或多餘,但大膽的格式使其脫穎而出,沒有明顯的原因。 – Adriaan

回答

4

好的,我找到了適合我的解決方案。我主要關注的是:

  • 我希望k組合是隨機的。
  • 處理時間。

的下面功能樣品尺寸p的單個隨機組合,(即row = randperm(N,p))每次迭代,並增加了該組合,如果它不是已存在。

這三個參數中,主要是k影響處理時間。對於不太大的k,此代碼運行在幾秒鐘內。我自己遇到的最極端的情況是N = 10^6, k = 2000, p = 10,它仍然在1秒內運行。

我希望這也能幫助其他人,因爲我在多個網站上遇到過這個問題,但沒有一個滿意的答案。

function C = kcombsn(N,k,p) 
    C  = randperm(N,p); 
    Csort = sort(C,2); 

    while size(C,1) < k 

     row = randperm(N,p); 
     row_sort = sort(row); 

     if isempty(intersect(row_sort,Csort,'rows')) 
      C = [C; row]; 
      Csort = [Csort; row_sort]; 
     end 
    end 

end 

編輯: 我也posted the code on the MATLAB File Exchange