【发布时间】:2021-06-17 16:09:58
【问题描述】:
我需要在一个范围内生成大量随机数,但有一些例外。现在我打算这样做,
public class Main
{
static List<Integer> except = Arrays.asList(5, 6, 11, 12, 17, 18, 23, 25, 28, 29);
public static void main(String[] args) {
List<Integer> randomNums = new ArrayList<>();
Random random = new Random();
int z;
for(i=0; i<20; i++) {
z = random.nextInt(30);
while(except.contains(z)) z = random.nextInt(30);
randomNums.add(z);
}
System.out.println(randomNums);
}
}
在我的情况下,“except”和“randomNums”的大小会大得多。所以代码会在一段时间内花很多时间来避免我不想要的数字。
我很想知道我可以加快我的代码速度吗?如果我可以删除 while 循环,那么肯定会是 O(n)。但我该怎么做。 谢谢。
【问题讨论】:
-
对
except使用集合而不是列表。那么contains()方法的 O(1) 而不是 O(n)。 -
据我所知,无法删除 while 循环!
-
我在想,如果我可以使用“随机数”->“我需要的数字(不包括除外中的数字)”中的某种映射,那么我可以删除 while 循环。 @K。史密斯
-
你的随机数的范围是变化的还是不变的?
-
您可以创建一个可接受数字的列表,然后使用随机生成器从该列表中的给定位置获取数字,但是我不知道这有多有用,因为您必须生成此列表一开始。