В других языках есть функции для случайного перемешивания элементов массива (такие как функция PHP shuffle ), в случае с Java я не знаю, есть ли аналогичная функция, поэтому на данный момент я вижу, что функции созданный из кода для этой цели.
На многих страницах ( например, на официальном сайте на английском языке ) приведены коды функций, способные решить проблему, но некоторые из найденных решений кажутся несколько устаревшими.
Часто даже ответы, которые распространяются в Интернете , не совсем эффективны и не работают в 100% случаев.
Требуется, чтобы алгоритм мог:
- Перемешивать массивы , содержащие элементы любого типа (символы, числа, строки, массивы и т. д.).
- Это может упорядочить массивы любого размера.
- и что результат имеет приемлемую степень энтропии (беспорядка).
Вот пример кода в java
private static void shuffleArray(int[] array)
{
int index;
Random random = new Random();
for (int i = array.length - 1; i > 0; i--)
{
index = random.nextInt(i + 1);
if (index != i)
{
array[index] ^= array[i];
array[i] ^= array[index];
array[index] ^= array[i];
}
}
}
Код, полученный в результате случайного перемешивания массива
Как я могу изменить порядок любого типа массива независимо от размера и типа содержащихся в нем элементов с помощью более короткого кода с меньшим количеством строк?
Спасибо.
Для начала давайте приступим к проблеме алгоритма перетасовки . Алгоритм, который вы можете использовать, который работает «на месте» и имеет сложность O (N), — это алгоритм Кнута, который вы можете проверить здесь . Вот пошаговый алгоритм:
i
от0
доN
:j
между0
иN
i
иj
Тогда, что касается вашего вопроса о том, как перетасовать любой тип данных, вам следует ознакомиться с темой дженериков в Java .
Реализация, которая отвечает обоим требованиям, выглядит следующим образом:
Функция
swap
меняет местами числа в массиве, в то время как функцияshuffle
перебирает элементы и генерирует случайные числа.Параметры
<T>
позволяют этим функциям поддерживать любой тип объекта, чтобы использовать их, вы добавляете их<T>
перед возвращаемым типом, а затем используете типT
в аргументах или в теле функции. Однако обратите внимание, что дженерики не работают с примитивными типами, такими какint
илиchar
, поэтому массивы должны иметь такие типы, какInteger
,String
и т. д.После преобразования вашего массива в
List
У вас есть метод shuffle класса
Collections
, который позволяет вам перетасовать указанный список, используя случайный источник по умолчанию.Вы можете увидеть еще несколько примеров его использования в java-shuffle-collection .
https://www.programcreek.com/2012/02/java-method-to-shuffle-an-int-array-with-random-order/ вы можете найти более подробную информацию.
Например, у меня есть приложение, написанное на Java, которое при запуске случайным образом показывает мне фоновое изображение, и я делаю это следующим образом.
Таким образом, всякий раз, когда я открываю приложение, оно загружает другое изображение.