2014-10-13 4 views
0

Я хочу выбрать 8 случайных чисел в диапазоне 0-7.Выберите несколько случайных чисел в определенном диапазоне без дубликатов

int one = (int) (Math.random()*0)+7; 
int two = (int) (Math.random()*0)+7; 
// ... 
int eight = (int) (Math.random()*0)+7; 

Однако дублирующихся номеров не допускается. Как я могу улучшить этот код, чтобы установить это?

+5

Используйте [набор] (http://docs.oracle.com/javase/7/docs/ api/java/util/Set.html), чтобы добавить свой номер. В наборе дубликатов не разрешается и цикл, пока вы не получите сколько вам образцов. Другой подход заключается в использовании [Collections.shuffle (yourCollection)] (http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle (java.util.List)), если набор образцов не слишком большой для построения. – StackFlowed

+5

Создайте 'ArrayList ', а затем перетасуйте его через' Collections.shuffle (...) '. Это либо это, либо сохранение выбранных номеров, и повторное выбор, если выбранный номер уже выбран. Вы можете это сделать, я знаю, что вы можете. –

+0

Вам нужен алгоритм перетасовки. – CoverosGene

ответ

0

Следуйте приведенному ниже фрагменту и измените maxLimit и noOfItems в соответствии с вашими предпочтениями, чтобы получить желаемый результат.

Здесь Набор содержит уникальные целые числа с заданным пределом.

public class RandomIntegers 
 
{ 
 
    public static final Random random = new Random(); 
 
    public static final int maxLimit = 8; 
 
    public static final int noOfItems = 8; 
 
    public static void main(String[] args) 
 
    { 
 
     Set<Integer> uniqueRandomIntegerSet = new HashSet<Integer>(); 
 
     
 
     while(uniqueRandomIntegerSet.size() < noOfItems) 
 
      uniqueRandomIntegerSet.add(random.nextInt(maxLimit)); 
 
    } 
 
}

0

Я не уверен, если это нарушает ваши требования, но вы могли бы просто идти, как это:

public static void main(String[] args) { 
    List<Integer> randomZeroToSeven = new ArrayList<>(); 
    for (int i = 0; i <= 7; i++) { 
     randomZeroToSeven.add(i); 
    } 
    Collections.shuffle(randomZeroToSeven); 
} 

В качестве альтернативы, вы можете пропустить shuffle и просто захватить случайный элемент из списка каждый раз, когда вам нужно случайное число от 0 до 7. EG:

public static void main(String[] args) { 
    List<Integer> zeroToSeven = new ArrayList<>(); 
    for (int i = 0; i <= 7; i++) { 
     zeroToSeven.add(i); 
    } 

    System.out.println(zeroToSeven.get(new Random().nextInt(8))); 

} 
0

Если вам нужно генерировать числа от min до max (в том числе и), вы можете написать random.nextInt(max - min + 1) + min

public static void main(String[] args) throws IOException { 

     HashSet<Integer>list=new HashSet(); 
     Random random=new Random(); 
     while(list.size()<8){ 
      list.add(random.nextInt(7 - 0 + 1) + 0); // OR list.add(random.nextInt(8)); 

     } 
     System.out.println(list); 

    } 
+0

Не будет ли это дубликатов? Кроме того, почему 0? –

+0

'0' to' 7' здесь '0' является минимальным, а' 7' - максимальным диапазоном – Rustam

+0

Нет, он не даст дубликатов. – Rustam

0

Другой способ заполнить массив/коллекция со всеми возможностями и выберите из них. Каждый выбранный элемент удаляется из разрешенного массива и помещается в выходной массив, пока вы не выбрали все элементы.

Таким образом, вы пропускаете двойной выбор, а выполнение является линейным.

Что-то вроде этого:

int desiredSize = 8; 
List<Integer> allowed = new ArrayList<>(); 
for (int i = 0; i < desiredSize; i++) { 
    allowed.add(i); 
} 

List<Integer> output = new ArrayList<>(); 
Random random = new Random(); 
while (output.size() < desiredSize) { 
    int index = random.nextInt(allowed.size()); 
    output.add(allowed.get(index)); 
    allowed.remove(index); 
} 
0

Есть только 8 числа от 0-7 и так, что вы действительно спрашиваете, для чисел от 0-7 в случайном порядке.

Самый быстрый способ сделать это как для кодирования, так и для исполнения - это перетасовать набор целых чисел.

public class Test { 

    public static void main(String[] args){ 

     List<Integer> list = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7); 
     Collections.shuffle(list); 
     for(int i : list){ 
      System.out.println(i); 
     } 

    } 
} 

Если вы хотите, чтобы написать перетасовки алгоритм самостоятельно вы можете сделать это, так обменивать каждый элемент (бар последний) в массиве со случайным индексом. Причина, по которой вы не делаете последнее, состоит в том, что она искажает результат. См Fisher Yates Shuffle

Просто потому, что я не мог сопротивляться здесь является реализация Java Фишера Йейтс:

public class Test { 

    public static void main(String[] args){ 
     Random rnd = new SecureRandom(); 
     int[] arr = new int[]{0,1,2,3,4,5,6,7}; 
     for(int i = 0; i < arr.length - 1; i++){ 
      int swapIndex = rnd.nextInt(8); 
      int tmp = arr[i]; 
      arr[i] = arr[swapIndex]; 
      arr[swapIndex] = tmp; 
     } 
     System.out.println(Arrays.toString(arr)); 

    } 

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