选择一个不存在的随机int

时间:2015-02-06 19:22:37

标签: java

我正在做的事情,我必须选择几个随机数,而不再选择相同的数字。我尝试了很多方法,但它们不起作用。我检查了我的int []中是否存在随机数,并将int重置为另一个随机,但是其他随机也存在,我尝试修复它但是我遇到了问题。

这是我目前的代码:

p.sendMessage("debug over max");
        Random r = new Random();
        for (int i=0;i<max + 1;i++) {
            int ran = r.nextInt(arenaAmount);
            if (ran == 0) ran = 1;
            arenas[i] = ran;
        }

这就是我到目前为止所拥有的, 所以我怎样才能确保它没有相同的数字。如果还有另一个帖子,请链接我。

谢谢,乔伊。

3 个答案:

答案 0 :(得分:1)

一个简单的解决方案是将已生成的数字添加到Set并生成随机数,直到找到Set中尚未包含的数字。

但这可能不是一个很好的解决方案,请查看已接受的答案here以获得详尽的解释。

正如Giovanni Botta在评论中提到的那样,here是另一个简单的解决方案,可能比基于Set的解决方案更好。

答案 1 :(得分:0)

使竞技场成为Set

Random r = new Random(); 
int ran = r.nextInt(); 
while( ! arenas.add(ran) ) {
   ran = r.nextInt(); 
}

添加将在尝试重新输入值时失败。

答案 2 :(得分:0)

您可以创建从1maxValue的整数列表,对其进行随机播放并获取numElements第一个元素:

List<Integer> shuffledList(int maxValue, int numElements) {
    if (numElements >= maxValue) {
        throw new IllegalArgumentException("The number of elements in the list must be less than maxValue.");
    }
    List<Integer> numbers = range(1, maxValue);
    Collections.shuffle(numbers);
    return numbers.subList(0, numElements);
}

List<Integer> range(int from, int to) {
    List<Integer> numbers = new ArrayList<>(to - from);
    for (int i = from; i < to; i++) {
        numbers.add(i);
    }
    return numbers;
}

这样,您可以确保在没有Set开销的情况下获得不同的数字。例如,调用shuffledList(10, 5)之类的调用会返回一个类似[8, 7, 5, 1, 2]的列表,其中包含5个元素,其中最小的可能元素为1,最大可能元素为9。

此外,如果您使用的是Java 8,则可以放弃range功能,而是执行此操作:

List<Integer> numbers = IntStream.range(1, maxValue)
                                 .boxed()
                                 .collect(Collectors.toList());