Страницы

Поиск по вопросам

понедельник, 25 марта 2019 г.

Выбор неповторяющихся случайных элементов из массива

Создаем массив чисел от 1 до 75, с помощью рандома чисел от 1 до 75 начинаем поиск элемента в массиве. Совпал - удалили. Ищем дальше. Совпал - удалили. Не нашли элемент - ищем снова пока не найдем.
Вот что вышло:
int[]array; int num = (int)(Math.random()*75+1);//имитируем выпадение числа от 1 до 75 public int[] initArray(){//создаем, инициализируем и заполняем массив цифрами от 1 до 75 включительно this.array = new int[75]; for (int i = 0; i < array.length; i++){ array[i] = i+1; } return array; } public static int findNumberInMass(int[] array, int num) { for (int i = 0; i < array.length; i++) { if (num == array[i]) { return i + 1; } } return 0;//вот тут он должен не найти нужный элемент и перезапустить поиск }
Прошу помощи, а то голова кипит. Как сделать так, чтоб он находил элемент выпавший в рандоме, искал его в массиве и удалял? И чтоб он искал совпадения, а если не нашел то перезапускал рандом?


Ответ

Если я правильно понял задачу, то приведённый ниже код иллюстрирует её решение.
class Main { private final static int[] numbers = initArray();
// Заполнение массива numbers числами от 1 по 75. private static int[] initArray() { final int[] array = new int[75]; for (int i = 0; i < array.length; ++i) array[i] = i + 1; return array; }
// Поиск позиции числа n в массиве numbers. Возвращает -1, если число не найдено. private static int findNumber(final int n) { for (int i = 0; i < numbers.length; ++i) if (numbers[i] == n) return i; return -1; }
// Получение следующего случайного числа. private static int nextRandom() { while (true) { // В бесконечном цикле... final int n = (int)(Math.random()*75+1); // ... берём случайное число, ... final int pos = findNumber(n); // ... и ищем его в массиве numbers. if (pos >= 0) { // Если число найдено, ... numbers[pos] = -1; // ... то "удаляем" его... return n; // ... и завершаем цикл, ... } } // ... иначе возвращаемся к началу. }
public static void main(final String[] args) { for (int ignored : numbers) System.out.println(nextRandom()); } }
Здесь применена небольшая хитрость. Во-первых, если мы не нашли число в массиве, то возвращаем заведомо невалидный индекс (-1). А во-вторых, поскольку удаление элемента массива выполнить без создания нового массива невозможно, то во избежание этой "дорогостоящей" операции мы просто помещаем в массив на место этого числа опять-таки заведомо невалидное значение (-1).

Комментариев нет:

Отправить комментарий