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是否包含相同的数字,因为它是随机的?
感谢阅读。
答案 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));