没有再生每次随机的一种可能的解决方案是使用以下算法:
public int getRandomWithExclusion(Random rnd, int start, int end, int... exclude) {
int random = start + rnd.nextInt(end - start + 1 - exclude.length);
for (int ex : exclude) {
if (random < ex) {
break;
}
random++;
}
return random;
}
这个方法可以用数组引用来调用,例如。
int[] ex = { 2, 5, 6 };
val = getRandomWithExclusion(rnd, 1, 10, ex)
或直接将号码插入呼叫:
val = getRandomWithExclusion(rnd, 1, 10, 2, 5, 6)
它在开始和结束(包括两端)之间生成一个随机数(int),不会给出数组中包含的任何数字。所有其他数字以相等的概率发生。注意,以下约束必须保持:exclude按升序排序,并且所有数字都在提供的范围内,并且所有数字都相互不同。