随机播放重复数字的向量,以便在MATLAB中不重复这些数字

时间:2015-04-27 00:31:42

标签: matlab vector numbers repeat

好的,所以我有一个脚本会产生一定间隔的重复整数向量,但是现在我需要确定一个特定的实例,一旦它被洗牌,数字就不会重复了。因此,例如,我制作了一个重复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)

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]
  • 使用随机播放的第一个和第二个值设置当前行的v1和v2的值。这两个值总是不同的。

代码:

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]的第一和第二值将始终不同。 如果您需要两个以上具有不同数字的数组,则更改很简单。