как поместить на случайные индексы в массиве конкретные числа

Только начинаю изучать java, данный код более-менее понятен

int n = 4;
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
  int j = rand.nextInt(i + 1);
  a[i] = a[j];
  a[j] = i + 1;
}

По логике задачи нам надо расположить КОНКРЕТНЫЕ (даны четыре числа) элементы массива в случайном порядке, т.е. метод rand.nextInt не подойдет, верно? Нам надо выбирать из 4-ёх конкретных чисел.


Ответы (1 шт):

Автор решения: Nowhere Man

Фактически это задача о случайном перемешивании элементов заданного массива. Код, представленный в вопросе, генерирует массив из n чисел от 1 до n, расставленных случайным образом, при помощи присваивания a[j] = i + 1;.

Следовательно, если задан некий массив исходных значений p, то достаточно брать значения из него:

int[] p = {4, 5, 23, 34};
int n = p.length;
int[] a = new int[n];

for (int i = 0; i < n; ++i) {
  int j = rand.nextInt(i + 1);
  a[i] = a[j];
  a[j] = p[i];
}

System.out.println(Arrays.toString(p) + " --> " + Arrays.toString(a));
// [4, 5, 23, 34] --> [23, 5, 4, 34]
// [4, 5, 23, 34] --> [5, 23, 34, 4]

Если известна некая функция для генерации исходных значений в зависимости от индекса i, можно использовать её a[j] = fun(i);


Другие стандартные способы перемешивания массива чисел:

  • Если массив определён как Integer[], проще использовать сочетание стандартных методов: Collections.shuffle(Arrays.asList(arrIntegers));:
    Arrays.asList создаст нерасширяемый список на основании заданного массива, и действия над элементами списка будут отражаться на соответствующие элементы исходного массива.
  • Если массив определён как массив примитивов int[], то можно переставить его элементы вручную, используя алгоритм Фишера-Йетса.
    В данном коде также показано, как можно переставить значения внутри массива без использования вспомогательной переменной при помощи побитовой операции XOR ^.
public static void shuffle(int[] arr) {
    Random rand = new Random();
    for (int i = arr.length; i-- > 0;) {
        int r = rand.nextInt(i + 1);
        arr[r] = arr[r] ^ arr[i] ^ (arr[i] = arr[r]);
    }
}
→ Ссылка