除了产生一定值的随机数(Generate random numbers except certain

2019-07-20 01:57发布

我想生成随机数,但不希望他们是从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 。 有什么问题?

Answer 1:

if(!exclude.contains(random))
    return random;

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



Answer 2:

我认为有一些失误。

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;
}


Answer 3:

你检查:

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

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

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

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



Answer 4:

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

为了简化问题,让我们看看如果我们只有一个不含值时会发生什么。 我们可以将结果拆分到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;
}


文章来源: Generate random numbers except certain values