生成除特定值之外的随机数

use*_*119 6 java random arraylist

我想生成随机数,但不希望它们来自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;
}
Run Code Online (Sandbox Code Playgroud)

我在while循环中使用此函数,并在每次迭代期间添加一个新值exclude.有时会返回属于的数字exclude.有什么问题?

qbe*_*ben 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;
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

有了Achintya Jha的答案我的代码可以改进(但请注意也有一些评论):

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;
}
Run Code Online (Sandbox Code Playgroud)


Ach*_*Jha 6

if(!exclude.contains(random))
    return random;
Run Code Online (Sandbox Code Playgroud)

每次返回不包含的值时都尝试这样做.