有没有办法在randperm中获得不同的洗牌方式?

时间:2017-03-28 13:30:28

标签: matlab rows shuffle

我有一个矩阵[1 2 3 4],我想用randperm几次洗牌,但我想获得不同的矩阵。例如

for i=1:4    
    m(i,:)=randperm(4); 
end

会给我4行4列,但我希望每一行与其他每一行不同;例如像这样:

m(1,:)=[1 3 4 2]
m(2,:)=[2 3 1 4]
m(3,:)=[2 1 4 3]
m(4,:)=[4 3 2 3]

2 个答案:

答案 0 :(得分:3)

您只需检查现有行以查看当前排列是否已存在

m = zeros(4, 4);

counter = 1;

while counter < 4
    new = randperm(4); 
    if ~ismember(new, m, 'rows')
        m(counter, :) = new;
        counter = counter + 1;
    end
end

另一种(内存密集型)方法是生成所有排列,然后随机选择其中的N个

allperms = perms(1:4);
N = 4;

m = allperms(randsample(size(allperms,1), N), :);

答案 1 :(得分:1)

您可以轻松使用MATLAB函数ismember来检查您刚创建的随机排列是否已包含在矩阵中。

所以你可以试试这样的事情:

for i=1:4
    temp = randperm(4);
    while ismember(m,temp,'rows')
      temp = randperm(4);
    end
    m(i,:) = temp;
end