2017-09-08 92 views
0

如何生成沒有重複對的隨機對序列? 下面的代碼已經產生對,但不避免重複:使用隨機對生成沒有重複的單元格

for k=1:8 
    Comb=[randi([-15,15]) ; randi([-15,15])]; 
    T{1,k}=Comb; 
end 

當運行我得到:

T= [-3;10] [5;2] [1;-5] [10;9] [-4;-9] [-5;-9] [3;1] [-3;10] 

該對[-3,10]是重複的,這是不可能發生的。

PS:條目可以是正數或負數。

這是否有內置函數?任何消化解決這個?

+0

你有統計工具箱嗎? –

+0

[Efficiently generated unique pairs of integers]的可能重複(https://stackoverflow.com/questions/15793172/efficiently-generating-unique-pairs-of-integers) –

+0

感謝您的鏈接(https://stackoverflow.com/questions/15793172/efficient-generating-unique-pairs-of-integers),但所提出的解決方案僅適用於正向組合。 – hello123

回答

2

如果有統計工具箱,可以使用randsample1採樣8編號,以31^2(其中31是總體大小),無需更換,然後「解包」每個獲得的數目爲一對的兩種組分:

s = -15:15; % population 
M = 8; % desired number of samples 
N = numel(s); % population size 
y = randsample(N^2, M); % sample without replacement 
result = s([ceil(y/N) mod(y-1, N)+1]); % unpack pair and index into population 

實例運行:

result = 
    14  1 
    -5  7 
    13 -8 
    15  4 
    -6 -7 
    -6 15 
    2  3 
    9  6 
+0

謝謝!有效。但只限於正面組合。而且我也想要負面組合。 – hello123

+1

@emanbap這是因爲你在我回答後改變了你的問題。無論如何,請參閱編輯答案 –

+0

謝謝!有用。 – hello123

2

您可以使用ind2sub

n = 15; 
m = 8; 
[x y]=ind2sub([n n],randperm(n*n,m)); 
+1

迄今爲止,我認爲最好的方法。 'ind2sub'可以簡單地推廣到多於'2'的組件 –

+1

您是否必須將輸入順序切換到'ind2sub'? –

+0

謝謝,但沒有爲我工作。 – hello123

1

兩種可能性:

1.

M = nchoosek(1:15, 2); 
T = datasample(M, 8, 'replace', false); 

2.

T = zeros(8,2); 
k = 1; 
while (k <= 8) 
    t = randi(15, [1,2]); 
    b1 = (T(:,1) == t(1)); 
    b2 = (T(:,2) == t(2)); 
    if ~any(b1 & b2) 
    T(k,:) = t; 
    k = k + 1; 
    end 
end 

第一種方法是可能更快但需要的多個存儲器和可能不是切實可行對於非常大的數字(例如:如果不是15,最大值是50000),在這種情況下,您必須使用2.

+0

謝謝!很好的實施。兩者都有效! :) – hello123