2014-01-22 2 views
0
public class LotteryNumbers { 
private ArrayList <Integer> numbers; 

public LotteryNumbers() { 
    this.numbers = new ArrayList <Integer>(); 
    this.drawNumbers(); 
} 

public ArrayList <Integer> numbers() { 
    return this.numbers; 
} 

public void drawNumbers() { 
    Random random = new Random(); 
    int counter = 0; 

    while (counter < 7) { 
     this.numbers.add(random.nextInt(39) + 1); 
     counter++; 
    } 

} 

Это класс, используемый для печати 7 чисел из 1..39.Поиск дубликатов случайных чисел в ArrayList

Он выполняет эту работу, но проблема в том, что я хочу, чтобы 7 случайных чисел были разными.

Как проверить, содержит ли массив список одинакового числа, так как он случайный?

Спасибо за чтение.

+0

Вы пробовали содержит() ?? .. Или вы пробовали использовать набор? – TheLostMind

+0

http://stackoverflow.com/questions/4228975/how-to-randomize-arraylist – gefei

ответ

3

Вы можете попробовать использовать метод из ArrayList numbers:

public void drawNumbers() 
{ 
    Random random = new Random(); 
    int counter = 0; 
    int choice; 
    while (counter < 7) { 
     choice = random.nextInt(39) + 1; 
     if (numbers.contains(choice)) { 
      continue; 
     } 
     numbers.add(choice); 
     counter++; 
    } 
} 

От Java Docs:

общественных логический содержит (Object о): Возвращает TRUE, если этот список содержит указанных элемент.

Таким образом, если ArrayList уже содержит choice (случайным образом), она будет продолжаться до следующей итерации (counter не будет увеличена) и выбрать другое случайное число. Если он не содержит choice, он добавит его в массив и увеличит counter.


Это также может быть сделано таким образом (без использования continue)

if (!numbers.contains(choice)) { 
    numbers.add(choice); 
    counter++; 
} 
+0

Спасибо, Кристиан! Это сработало. Я пробовал что-то вроде этого, и теперь я знаю, почему это не сработало. Моя ошибка была в том, что я положил int choice = random.nextInt (39) + 1; вне цикла, который продолжал давать мне одно и то же случайное число, но после прочтения кода я теперь могу понять, что мне пришлось делать это в цикле, чтобы каждый раз получать новое случайное число. Еще раз спасибо. – user3116280

2

Как проверить, если ArrayList содержит одинаковое число, так как он является случайным?

Как это (пример):

public void drawNumbers() { 
    Random random = new Random(); 
    int counter = 0; 

    while (counter < 7) { 
     int newNumber = random.nextInt(39) + 1; 
     if (! numbers.contains(newNumber)) { 
      this.numbers.add(newNumber); 
      counter++; 
     } 
    } 
} 
0

Вы можете использовать содержит в качестве более ранние ответы предполагают, однако, содержит в списке массива в неэффективна с O(n) сложности. Один из комментариев @TheLostMind предлагает использовать Set, наилучшая реализация Set для использования в этом экземпляре - BitSet, обратите внимание, что он не подтверждает спецификацию интерфейса java.util.Set.

public class LotteryNumbers { 
private final int[] numbers = new int[7] 

public LotteryNumbers() { 
    this.drawNumbers(); 
} 

public int[] numbers() { 
    return this.numbers; 
} 

public void drawNumbers() { 
    BitSet selected = new BitSet(40); 
    Random random = new Random(); 
    int counter = 0; 

    while (counter < 7) { 
     int num = random.nextInt(39) + 1; 
     if(!selected.get(num)) { 
      selected.flip(num); 
      numbers[counter++] = num; 
     } 
    } 

} 

Эта реализация, маловероятная, не гарантирует, что вы всегда получите результат.

0

Вы также можете поместить свои номера в список и использовать COllections.shuffle и получить первые 7 вхождений.

Вам не нужно, чтобы проверить, если дубликат ...

список ArrayList = новый ArrayList(); list.add (1); list.add (2); ....

Collections.shuffle (list);

цикл и получить ваши номера ...

int num = Integer.intValue (list.get (i));

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