2016-02-05 3 views
-4

Я пытаюсь запустить этот код без дубликатов, но у меня нет успеха в изучении этой области.Случайное генерирование элементов без дубликатов Java

Сначало вопрос, который я делаю, который попросит пользователя ввести отсутствующий элемент. Однако, когда я генерировать случайные элементы, я получаю дубликаты

import java.util.Random; 

public class QuestionOneA2 { 

    public static void main(String[] args) { 

     String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"}; 
     Random numberGenerator = new Random(); 

     for (int i = 0; i < 5; i++) { 
      int nextRandom = numberGenerator.nextInt(6); 
      System.out.println(fruit[nextRandom]); 
     } 


    } 

} 
+1

Итак, вы пытаетесь выбрать 5 случайных предметов из набора из 6 предметов? –

+1

Применить 'Collections.shuffle()' к заполненному последовательности списку –

+0

Да Я пытаюсь случайным образом выбрать 5 из 6 без дубликатов – StudentCoder

ответ

1

При генерации случайного числа, я предлагаю добавить его в массив.

Затем, когда вы создаете свой следующий номер, выполните поиск (google для чего-то эффективного), чтобы проверить, находится ли это число уже в массиве и, следовательно, уже используется.

Если это так, создайте новый, если его нет, используйте его.

Вы можете сделать это, вложив его в цикл while.

Хотя, исходя из того, что я могу сказать по вашему вопросу, вам было бы лучше просто создать копию вашего массива фруктов с помощью ArrayList, а затем, когда вы создадите случайное число, чтобы выбрать фрукты, просто удалите этот фрукт из этот новый список и уменьшите диапазон случайных чисел, которые вы генерируете.

+0

бинарный поиск работает только в отсортированных массивах –

+0

@ СашаСалауу правильно, не знаю, о чем я думал, ха-ха! – James

1

Существует множество различных подходов, которые вы можете рассмотреть, в зависимости от того, насколько гибким должен быть алгоритм.

Принимая 5 случайных элементов из списка 6, это то же самое, что и элемент выбора 1 из списка 6, который вы не выбираете. Это очень негибкий, но очень простой.

Другим подходом может быть удаление элемента из списка и уменьшение максимального случайного числа. В этой причине я бы посоветовал не использовать String[].

+0

Хранение его в строке является одним из требований того, что я пытаюсь сделать. – StudentCoder

-1
fruit.remove(fruit[nextRandom]); 

Возможно, это удаленный под-метод?

+2

В массивах нет метода 'remove'. –

0

Скопируйте массив в List<String>, затем перетасовать ее, а затем просто выбрать элементы один за другим:

List<String> copy = new ArrayList<>(Arrays.asList(fruit)); 
Collections.shuffle(copy); 
for (String f : copy) 
    System.out.println(f); 
0

Если я вас правильно понял, вы хотите, чтобы выбрать N-1 элементов случайным образом из списка n элементов. Если да, то я рекомендую выбрать только одного наугад и взять всех остальных.

Arrays.shuffle(fruit); 
int notThis = numberGenerator.nextInt(6); 
for(int i = 0; i < fruit.length; i++) 
    if(i!=notThis) System.out.println(fruit[i]); 
+0

Если он это сделает, он может снова и снова получать одинаковый заказ. Например, если «яблоко» исключено, то порядок будет «OPBSM», и если «pear» исключен, тогда порядок будет «OABSM». В обоих случаях порядок «Orage» фиксируется, т. Е. 0. – user2004685

+1

Затем сначала перетасовывайте фрукты, затем эта проблема также исправлена: перед печатью результатов необходимо добавить Arrays.shuffle (фрукты). Я добавил это к моему решению. – thorshammer

+0

Да, «перетасовка» сделала бы это. – user2004685

1

Вы можете использовать Set для проверки, если случайное сгенерированное число является дубликатом или нет. Вам просто нужно продолжать генерировать randomNumber, пока не найдете уникальный случайный случай, а затем добавьте его в Set, чтобы предотвратить дубликаты.

Вот краткий фрагмент кода:

public static void main(String[] args) { 
    String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"}; 
     Random numberGenerator = new Random(); 
     /* Generate A Random Number */ 
     int nextRandom = numberGenerator.nextInt(6); 
     Set<Integer> validate = new HashSet<>(); 
     /* Add First Randomly Genrated Number To Set */ 
     validate.add(nextRandom); 
     for (int i = 0; i < 5; i++) { 
      /* Generate Randoms Till You Find A Unique Random Number */ 
      while(validate.contains(nextRandom)) { 
       nextRandom = numberGenerator.nextInt(6); 
      } 
      /* Add Newly Found Random Number To Validate */ 
      validate.add(nextRandom); 
      System.out.println(fruit[nextRandom]); 
     } 
} 

Выход:

mango 
apple 
strawberry 
pear 
orange 
0

Вы можете обернуть ИНТ в 'Interger' и добавить его в Set. Набор не содержит дубликатов, поэтому в нем будут только уникальные значения. Итак, тогда просто проверьте, дал ли Set уже заданный Integer с Set.contains (Integer).

0

мое личное решение:

private static int[] randomIndexes(int len) { 
    int[] indexes = new int[len]; 
    for (int i = 0; i < len; i++) { 
     indexes[i] = i; 
    } 
    for (int i = len - 1, j, t; i > 0; i--) { 
     j = RANDOM.nextInt(i); 
     t = indexes[j]; 
     indexes[j] = indexes[i]; 
     indexes[i] = t; 
    } 
    return indexes; 
} 

в действии: https://gist.github.com/GautierLevert/a6881cff798e5f53b3fb

0

Я думаю, что это будет проще с помощью ArrayList, а также контролировать генерацию случайного числа, как показано ниже.

import java.util.Random; 

public class QuestionOneA2 { 

     public static void main(String[] args) { 

     List<String> fruits = new ArrayList<>(); 

     fruits.add("orange"); 
     fruits.add("apple"); 
     fruits.add("pear"); 
     fruits.add("bannana"); 
     fruits.add("strawberry"); 
     fruits.add("mango"); 

     Random numberGenerator = new Random(); 
     int nextRandom; 

     for (int i = 0; i < 6 ; i++) { 
      nextRandom = numberGenerator.nextInt(6 - i); 
      System.out.println(fruits.get(nextRandom)); 
      fruits.remove(nextRandom); 
     } 
     } 

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