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.有什么问题?
我认为有一些错误.
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)
if(!exclude.contains(random))
return random;
Run Code Online (Sandbox Code Playgroud)
每次返回不包含的值时都尝试这样做.