Случайная перетасовка массива
Мне нужно случайным образом перетасовать следующий массив:
int[] solutionArray = {1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1};
Есть ли какая-нибудь функция для этого?
Переведено автоматически
Ответ 1
Использование коллекций для перетасовки массива примитивных типов немного излишне...
Реализовать функцию самостоятельно достаточно просто, используя, например, метод Фишера–Йейтса в случайном порядке:
import java.util.*;import java.util.concurrent.ThreadLocalRandom;class Test{ public static void main(String args[]) { int[] solutionArray = { 1, 2, 3, 4, 5, 6, 16, 15, 14, 13, 12, 11 }; shuffleArray(solutionArray); for (int i = 0; i < solutionArray.length; i++) { System.out.print(solutionArray[i] + " "); } System.out.println(); } // Implementing Fisher–Yates shuffle static void shuffleArray(int[] ar) { // If running on Java 6 or older, use `new Random()` on RHS here Random rnd = ThreadLocalRandom.current(); for (int i = ar.length - 1; i > 0; i--) { int index = rnd.nextInt(i + 1); // Simple swap int a = ar[index]; ar[index] = ar[i]; ar[i] = a; } }}
Ответ 2
Вот простой способ, использующий ArrayList:
ArrayList
List<Integer> solution = new ArrayList<>();for (int i = 1; i <= 6; i++) { solution.add(i);}Collections.shuffle(solution);
Ответ 3
Вот рабочая и эффективная функция перетасовки массива Фишера–Йейтса:
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]; } }}
или
private static void shuffleArray(int[] array){ int index, temp; Random random = new Random(); for (int i = array.length - 1; i > 0; i--) { index = random.nextInt(i + 1); temp = array[index]; array[index] = array[i]; array[i] = temp; }}
Ответ 4
КлассCollections имеет эффективный метод перетасовки, который можно скопировать, чтобы не зависеть от него:
/** * Usage: * int[] array = {1, 2, 3}; * Util.shuffle(array); */public class Util { private static Random random; /** * Code from method java.util.Collections.shuffle(); */ public static void shuffle(int[] array) { if (random == null) random = new Random(); int count = array.length; for (int i = count; i > 1; i--) { swap(array, i - 1, random.nextInt(i)); } } private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; }}