2

配列を再起動するたびに (randperm を使用して) 順序を変更して、配列を複数回ループしています。

私の問題は、配列の順序について以下のようなものが時々得られることです。

1 3 5 6 8 7 2 4 9     
9 4 2 7 8 6 5 3 1

最初の配列ループの終わりは、次の配列ループの始まりと同じであることに注意してください。これを制御する方法はありますか?

順序をランダム化してループを続行する前に、ループの終了直前にrng (n)andを入れてみましたが、それは役に立ちません。randn(n)

編集 - コード

for b = 1;
while b <= 2
  for n = randperm(length(V));
  disp(V {n});
  end
b = b+1;
end
end
4

2 に答える 2

3

ja72の提案を実装する短い解決策は次のとおりです。

V = 1:9;
b = 1;
while b <= 10
  nextperm = randperm(length(V)); %// Generate a random permutation

  %// Verify permutation
  if (b > 1 && nextperm(1) == prevperm(end))
      continue
  end
  prevperm = nextperm;

  disp(V(nextperm));  
  b = b + 1;
end
于 2013-01-02T18:18:01.987 に答える
1

これがあなたが必要としているものだと思います。ランダム順列に落ち着く前のチェック条件ですか?

matrix = [11,22,33,44,55,66,77,88,99];
randOrder = zeros(length(matrix));
randOrderIntermediate = zeros(length(matrix));
randOrderPrev = zeros(length(matrix));

for i = 1:10

%Store the previous random order
randOrderPrev = randOrder;
%Create interim random order
randOrderIntermediate = randperm(length(matrix));
%check condition, is the first the same as the previous end?
while randOrderIntermediate(end) == randOrderPrev(1)
    %whilst condition true, re-randomise
    randOrderIntermediate = randperm(length(matrix));
end
%since condition is no longer true, set the new random order to be the
%intermediate one
randOrder = randOrderIntermediate;

%As with your original code.
for n = randOrder
    disp(matrix(n))
end

end
于 2013-01-02T17:31:27.657 に答える