2015-07-27 2 views
3

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

import java.util.Random; 

class FTW { 
    public static void main (String[]args){ 
     Random I = new Random(); 
     int number; 

     for(int counter=1; counter<=20;counter++){ 
      number = I.nextInt(20); 
      System.out.println(number + " "); 
     } 
    } 
} 

может ли один помочь мне изменить это или может дать мне лучше тот, который делает работу и объяснить мне, если это возможно :)

+3

http://stackoverflow.com/questions/8115722/generating-unique-random-numbers-in-java – Satya

+0

класс FTW, на самом деле? .... –

+0

Добавьте их в отсортированный набор, пока вы не достигнете размера 20 – dotvav

ответ

0

Один из способов - добавить числа в ArrayList и проверить, содержит ли он следующее случайное число в цикле while. (Эти 20 уникальных случайных чисел от 0-100)

public class FTW { 
    public static void main (String[]args){ 
     Random I = new Random(); 
     List<Integer> list = new ArrayList<Integer>(); 
     int number; 

     for(int counter=1; counter<=20;counter++){ 
      number = I.nextInt(100); 
      while(list.contains(number)) { 
       number = I.nextInt(100); 
      } 
      list.add(number); 
     } 
     Collections.sort(list); //Sorts the list 
     System.out.println(list); 
    } 
} 
0

Использование HashSet сохранит уникальность

Это обеспечит случайный набор 20 номера от 1 до 50

public static void main(final String[] args){ 
     final Random random = new Random(); 
     final Set<Integer> intSet = new HashSet<>(); 
     while (intSet.size() < 20) { 
      intSet.add(random.nextInt(50) + 1); 
     } 
     final int[] numbers = new int[intSet.size()]; 
     final Iterator<Integer> iter = intSet.iterator(); 
     for (int i = 0; iter.hasNext(); ++i) { 
      numbers[i] = iter.next(); 
     } 
     System.out.println(Arrays.toString(numbers)); 
    } 
+0

Наборы хэшей не сохраняют порядок ... – ctwomey1

+0

@ ctwomey1 извините, не означает, что порядок, означающий уникальность, изменится сейчас –

0

Вы можете выполнить следующие шаги:
1. поддерживать ArrayList для хранения сгенерированных уникальных случайных чисел (uniqueSortedRandoms).
2. При вставке новый номер newNumber в этот ArrayList, проверить, если массив uniqueSortedRandoms содержит newNumber и будет ли newNumber больше или равна предыдущей. Я предполагаю, что массив отсортирован по возрастанию. Смотрите следующий код -

import java.util.Random; 

class FTW { 
    public static void main (String[]args){ 
     Random I = new Random(); 
     int newNumber; 
     List<Integer> uniqueSortedRandoms = new ArrayList<Integer>(); 


     for(int counter=1; counter<=20;){ 

      int previousNumber = -1 // initially set to -1 
            // because nextInt() can be 
            //range from 0 (inclusive) to 20 exclusive 
      newNumber = I.nextInt(20); 

      if(newNumber>previousNumber && !unqueSortedRandoms.contains(newNumber)){ 

       uniqueSortedRandoms.add(newNumber); 
       previousNumber = newNumber; 
       counter++; 
      } 

      System.out.println(number + " "); 
     } 
    } 
} 

Теперь ArrayList - uniqueSortedRandoms содержит все уникальные случайные числа, нужно в порядке возрастания.

Примечание:
1. Если вы используете random.nextInt(20), то он будет генерировать случайное число от 0 включительно до 20 эксклюзивных. И вам нужно 20 случайных чисел в отсортированном порядке. Таким образом, список массивов фактически содержит 20 чисел от 0 до 19. В этом случае вы можете просто сгенерировать arrayList с номерами от 0 до 19. Если требуется 20 случайных чисел в отсортированном порядке (не в диапазоне от 0 до 19), например [ 3, 4, 9, 10, ......], то вы можете использовать очень большой int в качестве параметра nextInt(int n) -

newNumber = I.nextInt(100); 

Теперь каждый newNumber будет находиться в диапазоне - 0<=newNumber<100. Таким образом, ваш массив будет содержать 20 уникальных случайных чисел в порядке возрастания.

2. The counter увеличивается внутри if-block (когда вновь генерируется случайное число вставляется в INT ArrayList), так что цикл продолжается, пока не получим 20-случайное число.

+0

большое спасибо ребятам он отлично работал :) :) и про имя FTW - это потому, что я слишком много раз пробовал и имел много имен классов, и у меня получились даже более странные имена, чем этот xD – Tim

+0

@Tim, в этом случае вы можете подумать о том, чтобы повысить или принять ответ :) – Razib

0

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

public static void main(String[] args) { 
     int maxNumber = 150; 
     int totalCount = 20;   
     Random random = new Random(); 

     boolean[] generatedNumbers = new boolean[maxNumber]; 
     int generatedCount = 0; 

     while (generatedCount < totalCount){ 
      int newNumber = random.nextInt(maxNumber); 
      if (generatedNumbers[newNumber] == false){ 
       generatedNumbers[newNumber] = true; 
       generatedCount++; 
      } 
     } 

     int[] sortedUniqueArray = new int[totalCount]; 

     int selectedNumbers = 0; 
     for (int i = 0; i < generatedNumbers.length; i++) { 
      if (generatedNumbers[i] == true){ 
       sortedUniqueArray[selectedNumbers] = i; 
       selectedNumbers++;     
      } 
     } 

     System.out.println(Arrays.toString(sortedUniqueArray)); 
    } 

Выход для этого образца:

[6, 19, 33, 47, 51, 53, 71, 75, 82, 86, 89, 92, 105, 108, 121, 125, 126, 137, 140, 147] 
Смежные вопросы