我正在做的事情,我必须选择几个随机数,而不再选择相同的数字。我尝试了很多方法,但它们不起作用。我检查了我的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;
}
这就是我到目前为止所拥有的, 所以我怎样才能确保它没有相同的数字。如果还有另一个帖子,请链接我。
谢谢,乔伊。
答案 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)
您可以创建从1
到maxValue
的整数列表,对其进行随机播放并获取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());