2013-11-12 3 views
2

У меня есть простая проблема, и мне нужен быстрый способ достичь этого. Предположим, у меня есть две колонки, какБыстрый способ генерации случайных элементов столбцов

1 6 
3 5 
5 3 

Как вы видите, элемент 3 и 5 есть во 2-м столбце, я хотел бы, чтобы генерировать новые случайные элементы в первом столбце, таким образом, что не будет никаких элементов во втором столбце. Элементы могут быть от 1 -> 12

Мой подход: я добавил все элементы во втором столбце в хэш-набор, затем я ищу элементы в столбце один и проверяю, находятся ли они в хэш-наборе , если это правда, попробуйте создать новый случайный элемент.

У меня есть другая идея - визуализировать проблему как массив 1D, удалить дубликаты и т. Д., Но я не хочу изменять какие-либо элементы во втором массиве.

+0

Почему ваш подход не в состоянии, когда второй столбец содержит повторяющиеся цифры? – tskuzzy

+0

Итак, вы хотите, чтобы данные в столбце 1 никогда не появлялись в столбце 2? – NoChance

+0

, если вы получаете дубликаты в col1. Любые проблемы? – Trying

ответ

0

Я думаю, что это довольно прямо вперед решение

Random r = new Random(); 
    List<Integer> numbers = new ArrayList<>(Arrays.asList(new Integer[] { 
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 })); 

    Integer[] colOne = new Integer[] { 6, 5, 3 }; 
    numbers.removeAll(Arrays.asList(colOne)); 

    int notFoundInColOne = numbers.get(r.nextInt(numbers.size())); 

По сути, мы создаем наш ассортимент, удалить элементы в диапазоне, которые также в колонке, а затем выбрать случайный элемент от того, что осталось от нашего диапазона.

0
  1. Помещенный column2 значения HashSet.

  2. Просто используйте (Math.random() * 12)+1, который будет генерировать номер формы 1 до 12.

  3. Теперь поиск присутствует ли номер, который генерируется в set, если присутствует в set, чем регенерировать, т.е. перейти к шагу 2, иначе сделано.

Надеюсь, это поможет.

EDIT

O(1)

Я беру только аа маленький образец т.е. 5

  1. сначала создать массив, который содержит от 1 до 5, чем a [] = {1, 2, 3, 4, 5}
  2. сейчас пытаются генерировать случайное число от 1 до 5 (здесь вы генерируете индекс ar ray), давайте предположим, что он генерирует 2, чем заменяет последний элемент на 2. Итак, теперь массив будет [] = {1, 5, 3, 4} и уменьшит значение индекса.
  3. теперь вам нужно будет генерировать случайное число от 1 до 4. Предположим, что 3, чем своп 3 и последнее значение. Таким образом, массив равен {1, 5, 4}. Декремент индекс, то в настоящее время 3.
+0

для второго подхода, как вы убедитесь, что во втором столбце есть дублированный элемент? –

+0

@AhmedSaleh выше кода всегда генерирует уникальное число от 1 до 5. Нет повторения вообще. – Trying

+0

они должны быть уникальными, но не для себя, ко второй колонке. –

0

Я думаю, что этот подход будет работать на вас: для каждого номера от 1 до 12, если число не находится в столбце 2, добавьте его в список. В то время как столбец 1 не заполняется, произвольно выберите элемент из списка и удалите его, затем добавьте его в столбец 1.

0

Вы можете использовать следующие шаги: 1. Создайте массив. 2. Заполните его минимальным значением до максимального значения. 3. Суфле массива.Прочитайте массив последовательно.

Использование Fisher-Yates перетасовать алгоритм для Суффле

Смежные вопросы