Во-первых, нет ничего случайного в результате вы после - и Random.nextInt()
не даст вам уникальные перестановки, или обязательно все перестановки.
Для N элементов, есть N! (N -факториальные) уникальные последовательности, которые, я считаю, являются тем, чем вы являетесь. Поэтому ваши три элемента дают шесть уникальных последовательностей (3! = 3 * 2 * 1
).
Это потому, что у вас есть выбор из трех элементов для первой позиции (N
), то выбор из двух оставшихся элементов для второй позиции (N-1
), в результате чего один неизбранный элемента для последней позиции (N-2
).
Таким образом, это означает, что вы должны иметь возможность выполнять итерацию по всем перестановкам последовательности; и следующий код должны сделать это для последовательности из 3 элементов:
// Select element for first position in sequence...
for (int i = 0 ; i < 3 ; ++i)
{
// Select element for second position in sequence...
for (int j = 0 ; j < 3 ; ++j)
{
// step over indices already used - which means we
// must test the boundary condition again...
if (j >= i) ++j;
if (j >= 3) continue;
// Select element for third position in sequence...
// (there is only one choice!)
for (int k = 0 ; k < 3 ; ++k)
{
// step over indices already used, recheck boundary
// condition...
if (k >= i) ++k;
if (k >= j) ++k;
if (k >= 3) continue;
// Finally, i,j,k should be the next unique permutation...
doSomethingWith (i, j, k);
}
}
}
Теперь, большой оговоркой, что я только что написал эту ОТН, так что никаких guarentees. Однако, надеюсь, вы увидите, что вам нужно сделать. Разумеется, это можно и нужно обобщить для поддержки размеров суровых размеров, и в этом случае вы можете заполнить int[]
индексами для последовательности.
Однако, я думаю, что если вы посмотрите вокруг, будут созданы более эффективные алгоритмы для генерации перестановок последовательности.
У вас всегда есть 3 строки для перестановки? –
Число строк для этого случая равно 3, но будет большим, если цикл будет более гибким. @ Pier-AlexandreBouchard – Karkool