好的,所以我有一个脚本会产生一定间隔的重复整数向量,但是现在我需要确定一个特定的实例,一旦它被洗牌,数字就不会重复了。因此,例如,我制作了一个重复1-5次,36次重复的矢量。如何确保洗牌后没有重复的数字?为了使事情变得更加复杂,我需要生成两个这样的向量,这些向量在同一个索引中没有相同的值。例如,假设1:5对这些向量重复两次,那么这就是我正在寻找的东西:
v1 v2
4 2
2 4
3 2
5 3
4 5
1 4
5 1
1 5
3 1
2 3
我现在通过举一个矢量的例子并将其偏移1来创建另一个满足要求的矢量,但是在我的情况下,它实际上不起作用因为我不能系统地依赖于那样。
所以我尝试了一种递归技术,如果向量没有按照预期进行切换,那么脚本会重新启动,但这并不是很好。我达到了最大的递归迭代次数,我意识到这显然不是可行的方法。还有其他选择吗?
编辑:
所以我找到了一种方法来满足以下代码中我需要的一些条件:
a = nchoosek(1:5,2);
b = horzcat(a(:,2),a(:,1));
c = vertcat(a,b);
cols = repmat(c,9,1);
cols = cols(randperm(180),:);
我只需要找到一种方法来改变cols,这也会强制列中没有重复的数字,这样cols(i,1)〜= cols(i + 1,1)和cols(i,2)〜= COLS第(i + 1,2)
答案 0 :(得分:1)
这样可行,但对于大型数组来说可能效率不高:
a = nchoosek(1:5, 2);
while (any(a(1: end - 1, 1) == a(2: end, 1)) ...
|| any(a(1: end - 1, 2) == a(2: end, 2)))
random_indices = randperm(size(a, 1));
a = a(random_indices, :);
end
a
如果你想要更快的东西,诀窍是逻辑地将每一行插入满足条件的地方,而不是随机重新洗牌。例如:
n1 = 5;
n2 = 9;
a = nchoosek(1:n1, 2);
b = horzcat(a(:,2), a(:,1));
c = vertcat(a, b);
d = repmat(c, n2, 1);
d = d(randperm(n1 * n2), :);
% Perform an "insertion shuffle"
for k = 2: n1 * n2
% Grab row k from array d. Walk down the rows until a position is
% found where row k does not repeat with its upstairs or downstairs
% neighbors.
m = 1;
while (any(d(k,:) == d(m,:)) || any(d(k,:) == d(m+1,:)))
m = m + 1;
end
% Insert row k in the proper position.
if (m < k)
ind = [ 1: m k m+1: k-1 k+1: n1 * n2 ];
else
ind = [ 1: k-1 k+1: m k m+1: n1 * n2 ];
end
d = d(ind,:);
end
d
答案 1 :(得分:1)
解决此问题的一种方法是将两个向量视为如下创建:
对于每行数组v1和v2
[1 2 3 4 5]
代码:
s = [1 2 3 4 5];
Nrows = 36;
solution = zeros(Nrows,2);
for k=1:Nrows
% obtain indexes j for shuffling array s
[x,j] = sort(rand(1,5));
%row k takes the first two values of shuffled array s
solution(k,1:2) = s(j(1:2));
end
v1 = solution(:,1);
v2 = solution(:,2);
主要编辑:random =&gt;兰特,
使用这种方法,重新滚动重复数字没有浪费时间,因为改组[1 2 3 4 5]的第一和第二值将始终不同。 如果您需要两个以上具有不同数字的数组,则更改很简单。