您的方法确实非常适合创建大量唯一值,但是如果您只创建少量唯一值,则可以更有效地简单地跟踪使用的值以保证唯一性
import java.util.Collection;
import java.util.HashSet;
import java.util.Random;
public class UniqueRandom {
static Random rnd=new Random();
public static void main(String args[]){
Collection alreadyChosen = new HashSet();
for(int i=0;i<10;i++){
System.out.println(getNextUniqueRandom (alreadyChosen));
}
}
public static int getNextUniqueRandom(Collection alreadyChosen){
if (alreadyChosen.size()==90000){ //hardcoded 5 figure numbers, consider making a variable
throw new RuntimeException("All 5 figure IDs used");
}
boolean unique=false;
int value=0;
while(unique==false){
value=rnd.nextInt(90000)+10000;
unique=!alreadyChosen.contains(value);
}
alreadyChosen.add(value);
return value;
}
}
当只需要一小部分可用范围时,这种方法非常有效,但随着碰撞变得更加普遍,这种方法变得越来越慢.您应该选择的确切实现在很大程度上取决于您需要获得多少值.
要考虑的注意事项
>正如已经说过的那样,随着更多的值,这将变得非常缓慢选择,应该向最终用户明确,甚至更好;经过这么多次调用后改变算法