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

Is there any way to obtain different shuffled in randperm?

我有一个矩阵 [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]

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

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

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

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

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

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

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

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