Вместо использования такого пользовательского метода я рекомендую использовать OOTB Collections.shuffle . Отметьте this , чтобы понять логи c, реализованные для Collections.shuffle
.
Анализ вашего кода:
Math.random () возвращает double
значение с положительным знаком, большее или равное 0.0
и меньшее 1.0
.
Теперь давайте предположим, что numbers.size() = 5
и dry запустят for
l oop:
When i = 0, index = (int) (0 + Math.random()*(5 - 0)) = (int) (0 + 4.x) = 4
When i = 1, index = (int) (1 + Math.random()*(5 - 1)) = (int) (1 + 3.x) = 4
When i = 2, index = (int) (2 + Math.random()*(5 - 2)) = (int) (2 + 2.x) = 4
When i = 3, index = (int) (3 + Math.random()*(5 - 3)) = (int) (3 + 1.x) = 4
When i = 4, index = (int) (4 + Math.random()*(5 - 4)) = (int) (4 + 0.x) = 4
Как видите, значение index
будет оставаться 4
на каждой итерации, когда numbers.size() = 5
.
Ваши запросы:
как это гарантирует, что: i) мы не получим индекс выхода за пределы
Как уже объяснялось выше при использовании прогона dry, он никогда не будет go за пределами .
или ii) Я не буду изменять тот же элемент, т.е. index == i, и случайное перемешивание не будет таким случайным?
swap(numbers, i, index);
меняет местами элемент по индексу i
с элементом по индексу 4
каждый раз, когда numbers.size() = 5
. Это иллюстрируется следующим примером:
Скажем, numbers
= [1, 2, 3, 4, 5]
When i = 0, numbers will become [5, 2, 3, 4, 1]
When i = 1, numbers will become [5, 1, 3, 4, 2]
When i = 2, numbers will become [5, 1, 2, 4, 3]
When i = 3, numbers will become [5, 1, 2, 3, 4]
When i = 4, numbers will become [5, 1, 2, 3, 4]