如何生成一系列随机对而不重复对? 以下代码已生成对,但不会避免重复:
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 :(得分:2)
如果您拥有统计工具箱,则可以使用randsample
从8
到1
(其中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。