2017-09-08 59 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