首页 > 解决方案 > 在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)。但我该怎么做。谢谢。

标签: javalistrandom

解决方案


我的建议是你列出你想要在结果中出现的所有数字每次都从该列表中随机选择一个成员。它需要一些初始化,但之后你的循环应该运行得很快。

    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]


推荐阅读