как поместить на случайные индексы в массиве конкретные числа
Только начинаю изучать 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 шт):
Фактически это задача о случайном перемешивании элементов заданного массива. Код, представленный в вопросе, генерирует массив из 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]);
}
}