java - 在Java中生成一些范围内的许多随机数,但有一些例外
问题描述
我需要在一个范围内生成大量随机数,但有一些例外。现在我打算这样做,
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)。但我该怎么做。谢谢。
解决方案
我的建议是你列出你想要在结果中出现的所有数字,每次都从该列表中随机选择一个成员。它需要一些初始化,但之后你的循环应该运行得很快。
int maxExclusive = 30;
Integer[] baseArr = new Integer[maxExclusive];
Arrays.setAll(baseArr, Integer::valueOf);
List<Integer> base = new ArrayList<>(Arrays.asList(baseArr));
base.removeAll(except);
List<Integer> randomNums = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 20; i++) {
Integer z = base.get(random.nextInt(base.size()));
randomNums.add(z);
}
System.out.println(randomNums);
示例输出:
[1, 10, 27, 2, 24, 22, 7, 8, 0, 27, 19, 27, 15, 14, 21, 22, 13, 24, 2, 13]
推荐阅读
- python - 如何找到表示为字符串和部分分数的两个数字的中点,例如。'1 1/2 - 2'?
- python - 具有最接近值的熊猫数据框自定义插补
- sql - 当且仅当连接表包含所有值列表时,SQL 查询来查找记录
- python - 如何修复错误:缺少 Python 要求
- vb.net - vb.net Postgressql - .net 应用程序在 devl vm 上运行良好,但在客户端计算机上运行时出现 DLL 错误
- java - 为什么在 Android 上使用 Java/Kotlin 而不是 Python?
- css - 如何使用 Ant Design PageHeader 将项目对齐到中心?
- javascript - 如何在 Laravel 上使用 Ajax?
- c++ - 具有队列作为成员的类的 C++ 构造函数和析构函数
- c - 如何手动分配内存