2014-01-29 3 views
0

У меня есть метод, который работает неправильно. Метод должен сортировать набор чисел от 1 до 20 случайным образом (каждый номер должен появляться только один раз). Моя проблема в том, что когда я запускаю программу, некоторые числа повторяются несколько раз. код выглядит следующим образом:Проблема со случайным методом

public static int randomize(int index) { 

    //This array will hold the 20 numbers. 
    int[] randomIndex = new int[20]; 

    Random ranNum = new Random(); 

    for (int x = 0; x<20; x++) { 
     int temp; 

     //The number is generated randomly and saved in temp. 
     temp = ranNum.nextInt(20); 

     //This loop skips the first index. 
     if (x != 0){ 

      /*Here, the loop is supposed to compare a generated number with 
      the previous one*/ 
      for (int y = 1; y<=x; y++) { 


       while(temp == randomIndex[x-y]) { 

        /*If the while loop finds that temp variable matches any previous       
        number it will generate another random number for it until it finds 
        no matches.*/ 
        temp = ranNum.nextInt(20); 

       } 
      } 
     } 

    /*Once no match has been found for temp, the number is assigned to an index, 
    and the loop is executed with a x variable increment. 
    randomIndex[x] = temp; 

    } 
    //Finally the array with the set of random numbers is sent to the main function. 
    return randomIndex[index]; 

    } 

И я получил следующий вывод:

19, 19, 5, 16, 6, 2, 18, 1, 15, 1, 5, 19, 11, 4, 18, 0, 5, 18, 10. 

Так что теперь я понятия не имею, что делать. : C

+1

Не могли бы вы добавить комментарии о том, что ваш код * предполагается * делать? Я думаю, что это также поможет вам в отладке! –

+0

Почему бы не использовать метод 'List' и' Collections.shuffle() '? –

+0

Или, по крайней мере, добавить каждый номер, который вы уже нарисовали в списке, и проверить, является ли это дубликат с List.contains (newNumber)? – sheltem

ответ

1

Когда вы используете Random.nextInt(), нет никакой гарантии, что генерируемые числа уникальны. Сначала вы должны сгенерировать числа от 1 до 20, а затем перетасовать цифры. Теперь вопрос изменен на «Как случайным образом перемешать числа?»

Возможно, вы можете обратиться к реализации JDK Collections.shuffle().

Алгоритм перестановки чисел просты:

  1. Pick первый элемент массива и поменять его с номером в произвольном положении.
  2. Повторите шаг 1 до последнего элемента.
0

Вы можете избежать этого, используя что-то вроде этого:

final Random random = new Random(); 


    final HashSet<Integer> integers = new HashSet<>(); 

    while(integers.size() < 20) { 
     integers.add(random.nextInt(20)); 
    } 

    System.out.println(integers); 
0

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

Как уже упоминалось, было бы гораздо эффективнее генерировать числа от 1 до 20 и перетасовывать их со случайной перестановкой. Однако, если они будут выполнены правильно, ваш подход должен работать ... в конце концов.

случайная реализация перетасовка может выглядеть примерно так:

for(int i=0; i<20; i++) { // index goes from 0..19 
    randomIndex[i] = i + 1; // value goes from 1..20 
} 

for(int i=0; i<20; i++) { 
    int j = i + ranNum.nextInt(20 - i); // choose random j from i <= j < 20 
    int temp = randomIndex[i];   // swap elements i and j 
    randomIndex[i] = randimIndex[j]; 
    randomIndex[j] = temp; 
} 

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

Во-вторых, я считаю, что конструктор new Random() генерирует различное семя каждый раз, когда он вызывается. Если это так, ваша функция randomize() генерирует совершенно другой случайный список каждый раз и возвращает выбранный индекс из него. В любом случае имеет смысл возвращать весь массив.

0

Я отредактировали функцию для генерации массива от 1 до 20:

public static int[] randomize() { 

    int[] randomIndex = new int[20]; 

    Random ranNum = new Random(); 
    boolean isAlreadyIn; 
    boolean isZero; 
    int x = 0; 

    while (x < 20) { 
     isAlreadyIn = false; 
     isZero = false; 
     int temp; 
     temp = ranNum.nextInt(21); 
     for(int i = 0; i < randomIndex.length; i++){ 
      if(temp == 0) 
       isZero = true; 
      if(temp == randomIndex[i]) 
       isAlreadyIn = true; 
     } 
     if (!isZero && !isAlreadyIn){ 
      randomIndex[x] = temp; 
      x++; 
     } 
    } 

    return randomIndex; 
} 

надеюсь, что это будет полезно.

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