使用随机对生成单元格而不重复

时间:2017-09-08 17:01:50

标签: matlab cell

如何生成一系列随机对而不重复对? 以下代码已生成对,但不会避免重复:

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:条目可以是正面的也可以是负面的。

这有内置功能吗?有什么消化来解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

如果您拥有统计工具箱,则可以使用randsample81(其中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

答案 1 :(得分:2)

您可以使用ind2sub

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

答案 2 :(得分: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。