在ArrayList中查找重复的随机数

时间:2014-01-22 15:24:51

标签: java random arraylist duplicates

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++;
    }

}

这是一个用于从1..39打印7个数字的类。

它完成了这项工作,但问题是我希望7个随机数不同。

如何检查arrayList是否包含相同的数字,因为它是随机的?

感谢阅读。

4 个答案:

答案 0 :(得分:3)

您可以尝试使用contains()中的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

  

public boolean contains(Object o):如果此列表包含,则返回true   指定的元素。

因此,如果ArrayList已经包含choice(随机生成),它将继续下一次迭代(counter将不会增加)并选择另一个随机数。如果它不包含choice,则会将其添加到数组并增加counter


这也可以通过这种方式完成(不使用continue

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

答案 1 :(得分: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++;
        }
    }
}

答案 2 :(得分:0)

您可以像之前的响应建议一样使用contains,但是在数组列表中包含效率低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;
        }
    }

}

这种实施方式不太可能,并不能保证您始终能得到结果。

答案 3 :(得分:0)

你也可以将你的数字放在一个列表中并使用COllections.shuffle并获得前7次出现。

您无需检查是否重复......

ArrayList list = new ArrayList();     list.add(1);     list.add(2);     ....

Collections.shuffle(列表);

循环并获取您的号码......

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