我想生成随机数,但不希望他们是从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
。 有什么问题?
if(!exclude.contains(random))
return random;
试试这个每次都将返回不排除值。
我认为有一些失误。
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;
}
你检查:
for(int i = 0; i < exclude.size(); i++) {
if(exclude.get(i) > random) {
return random;
}
如果只有第一较大,您将返回值。 你肯定exclude
进行排序?
您可以使用if(exclude.contains(random ))
或以下算法:
如果(end-start)
是一个合理的数目,你需要的几乎所有值,您可以创建所有可接受号码的列表,并使用此列表上的大小随机选择随机值作为索引。 然后从列表中删除不需要的数量,并得到另一个随机指数。
其实,我们并不需要使用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;
}