Collections.shuffle()
проходит через каждый индекс a Collection
назад и затем свопит его со случайным индексом, включающим или перед ним. Мне было интересно, почему, поэтому я попытался сделать то же самое, но обмен с любым случайным индексом в Collection
.
Вот перетасованная часть кода Collections.shuffle():
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
И вот мой алгоритм:
Random r = new Random();
for (int i = 0; i < a.size(); i++) {
int index = r.nextInt(a.size());
int temp = a.get(i);
a.set(i, a.get(index));
a.set(index, temp);
}
Я обнаружил, что Collections.shuffle()
был гораздо более равномерно распределен, чем мой код, когда я запускал оба на одном и том же ArrayList
миллион раз. Кроме того, при запуске моего кода:
[0, 1, 2, 3, 4]
кажется, что наиболее часто встречаются следующие перестановки:
[1, 0, 3, 4, 2]
[1, 2, 3, 4, 0]
[1, 2, 0, 4, 3]
[0, 2, 3, 4, 1]
[1, 2, 3, 0, 4]
Может кто-нибудь объяснить, почему?