Вы фактически ищете случайную перестановку целых чисел от 0
до n-1
.
Вы можете поместить числа от 0
до n-1
в ArrayList
, затемвызовите Collections.shuffle()
в этом списке, а затем извлеките числа из списка по одному:
final int n = 4;
final ArrayList<Integer> arr = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
arr.add(i);
}
Collections.shuffle(arr);
for (Integer val : arr) {
System.out.println(val);
}
Collectons.shuffle()
гарантирует, что все перестановки происходят с равной вероятностью.
Если вы хотите, вы можете инкапсулировать это в Iterable
:
public class ChooseUnique implements Iterable<Integer> {
private final ArrayList<Integer> arr;
public ChooseUnique(int n) {
arr = new ArrayList<Integer>(n);
for (int i = 0; i < n; i++) {
arr.add(i);
}
Collections.shuffle(arr);
}
public Iterator iterator() {
return arr.iterator();
}
}
Когда вы перебираете экземпляр этого класса, он производит случайную перестановку:
ChooseUnique ch = new ChooseUnique(4);
for (int val : ch) {
System.out.println(val);
}
На одном конкретном прогоне распечатывается 1 0 2 3
.