一种无需每次重新生成随机数的可能解决方案是使用以下算法:
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)start
and end
(两者都包含在内)并且不会为您提供数组中包含的任何数字exclude
。所有其他数字以相同的概率出现。请注意,必须满足以下约束:exclude
升序排列,所有数字都在给定的范围内,并且所有数字都互不相同。