После вашего вопроса я написал следующую программу. Я создал список последовательных целых чисел и перемешал его 10, 100, 1000 и 10000 раз. После каждой серии перемешиваний я проверял значение элемента в 5-й позиции массива и создавал массив счетчиков: сколько раз каждое число появляется в 5-й позиции.
Вот программа:
public class MyTest {
public static void main(String[] args) {
int n = 10;
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
list.add(i);
}
int[] counters = new int[n];
for(int shuffles : new int[] {10, 100, 1000, 10000}) {
Arrays.fill(counters, 0);
for (int i = 0; i < shuffles; i++) {
Collections.shuffle(list);
// check 5-th element
int fifth = list.get(5);
counters[fifth] = counters[fifth] + 1;
}
System.out.println(shuffles + ": " + Arrays.toString(counters));
}
}
}
А вот и результаты:
10: [0, 1, 1, 1, 2, 0, 0, 3, 2, 0]
100: [11, 9, 9, 7, 10, 12, 13, 13, 8, 8]
1000: [100, 101, 107, 101, 95, 96, 109, 83, 93, 115]
10000: [1015, 942, 990, 1003, 1015, 1037, 977, 1060, 950, 1011]
Как видите, "случайность" зависит от количества перемешиваний. Если вы перемешиваете массив 10 раз, минимальный счетчик равен 0, а максимальный - 3.
Разница между этими значениями для 100 перемешиваний (в процентах) значительно меньше.
Цифры почти одинаковы для 10000 тасовок.
Я думаю, что этот тест моделирует ваш вариант использования: вы показываете изображения в определенном положении перетасованной коллекции.
Пожалуйста, смотрите пост @amit, в котором описывается значение shuffle.
Итак, решение для вас - перетасовать ваш массив 10 раз.
РЕДАКТИРОВАТЬ: @ Дейв Уэбб дал идеальное объяснение случая.
Второе соображение заключается в следующем: на самом деле вам не нужно перемешивать список из 1000 элементов, чтобы взять из него 20 первых элементов. Достаточно взять 20 случайных элементов. Вы получите тот же эффект, но гораздо более эффективное решение:
Set<Image> show = new HashSet<Image>();
Random r = new Random(System.currentTimeMillis());
for (int i = 0; show.size() < 20; i++) {
show.add(list.get(r.nextInt()));
}