Generate random numbers except certain values
You check:
for(int i = 0; i < exclude.size(); i++) {
if(exclude.get(i) > random) {
return random;
}
and if only the first is larger, you'll return the value.
Are you sure exclude
is sorted?
You can use if(exclude.contains(random ))
or the following algorithm:
if (end-start)
is a reasonable number, and you need almost all values you can create a list of all acceptable numbers and use random on this list size and choose the random value as an index. then remove the unwanted number from the list and get another random index.
I think there are some mistakes.
1) Range should be end - start + 1, because this is the range wanted.
2) If you really want random numbers (as "random" as possible on computers) then you shouldn't just get the next available number. Because in this case your random number will bear the characteristics of excluded numbers density/frequency.
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
With Achintya Jha's answer my code could be improved (but note there are some remarks as well):
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;
}
if(!exclude.contains(random))
return random;
Try this every time it will return the value that is not in exclude.