除了产生一定值的随机数

问题描述 投票:6回答:4

我想生成随机数,但不希望他们从exclude阵列。这里是我的代码。

public int generateRandom(int start, int end, ArrayList<Integer> exclude) {
    Random rand = new Random();
    int range = end - start +1 - exclude.size();
    int random = rand.nextInt(range) + 1;

    for(int i = 0; i < exclude.size(); i++) {
        if(exclude.get(i) > random) {
            return random;
        }
      random++;
    }

    return random;
}

我用这个功能在一个while循环,并在每次迭代期间我添加了一个新的价值exclude。有时,它会返回属于exclude号码。有什么问题?

java random arraylist
4个回答
5
投票
if(!exclude.contains(random))
    return random;

试试这个每次都将返回不排除值。


8
投票

我认为有一些失误。

1)范围应该是结束 - 启动+ 1,因为这是范围通缉。 2)如果你真的想要的随机数(如“随机”的计算机上尽可能),那么你不应该只是得到一个可用的数字。因为在这种情况下,你的随机数将承担排除数字密度/频率特性。

public int generateRandom(int start, int end, ArrayList<Integer> excludeRows) {
    Random rand = new Random();
    int range = end - start + 1;
    int random;

    boolean success = false;
    while(!success) {
        random = rand.nextInt(range) + 1;
        for(Integer i: excludeRows) {
            if(i == random) {
                break;
            } else if (i > random) {
                success = true;
                break;
            }
        }
    }
    return random;
}

UPDATE

随着Achintya桑杰·贾的回答我的代码可以提高(但要注意有一些言论以及):

public int generateRandom(int start, int end, ArrayList<Integer> excludeRows) {
    Random rand = new Random();
    int range = end - start + 1;

    int random = rand.nextInt(range) + 1;
    while(excludeRows.contains(random)) {
        random = rand.nextInt(range) + 1;
    }

    return random;
}

2
投票

你检查一下:

for(int i = 0; i < exclude.size(); i++) {
    if(exclude.get(i) > random) {
        return random;
    }

如果只有第一较大,您将返回值。你肯定exclude排序?

您可以使用if(exclude.contains(random ))或以下算法:

如果(end-start)是一个合理的数目,你需要的几乎所有值,您可以创建所有可接受号码的列表,并使用此列表上的大小随机选择随机值作为索引。然后从列表中删除不需要的数量,并得到另一个随机指数。


-1
投票

其实,我们并不需要用while循环使用contains(random)

为了简化问题,让我们看看如果我们只有一个不含值时会发生什么。我们可以拆分结果2部分。然后可能值的数量是range-1。如果随机数小于排除的价值,只是返回。否则,我们可以添加1

对于多个不包括值,我们可以分割结果集到size+1部分,其中size意味着排除值的数量。然后可能值的数量是range-size。然后,我们剔除排序按升序值。如果随机数小于排除值减去i,那么我们只返回随机数加i,其中i是在排除值的指数。

public int generateRandomNumberWithExcepts(int start, int end, List<Integer> excepts) {
    int size = excepts.size();
    int range = end - start + 1 - size;
    int randNum = random.nextInt(range) + start;
    excepts.sort(null); // sort excluding values in ascending order
    int i=0;
    for(int except : excepts) {
        if(randNum < except-i){
            return randNum + i;
        }
        i++;
    }
    return randNum + i;
}
© www.soinside.com 2019 - 2024. All rights reserved.