最后将float(Float)替换成double(Double),创建6个一百万个和1个一千万个随机数据(从1开始),均未发现重复数据,排序后第一个数据为0的情况也未出现。
//比较稳定,未发现问题
public static int[] createIntArrayNoRepeat(int min, int max) {
int length = max - min + 1;
int[] a = new int[length];
Set<Double> set = new HashSet<Double>();
Random rand = new Random();
for (int i = min; i < max+1; i++) {
double increment=rand.nextDouble();
while(increment==0){
increment=rand.nextDouble();
}
set.add(i + increment);
}
int j = 0;
for (Double f : set) {
a[j++] = (int) f.doubleValue();
}
return a;
}
//有明显BUG
public static int[] createArray(int min, int max) {
int length = max - min + 1;
int[] a = new int[length];
Set<Float> set = new HashSet<Float>();
Random rand = new Random();
for (int i = min; i < max+1; i++) {
float increment=rand.nextFloat();
set.add(i + increment);
}
int j = 0;
for (Float f : set) {
a[j++] = (int) f.floatValue();
}
return a;
}
利用set的特性 It makes no guarantees as to the iteration order of the set. 来创建随机数(对于整型,是按照从小到大的顺序)。
但是:
浮点型数据会失真。
BUG1:数据中不应该有0
假设
i=1000时;
increment=0.99999;
i+increment=1001.0
i=1001时;
increment=0.00001;
i+increment=1001.0;
set中就丢失了一个应该存放进去的数。数组a中就多了一个没有被赋值,则为0。这也是为什么排序后,数组前几个数为0的原因(失了多个应该存放进去的数)。
BUG2:数据中出现重复的数
假设
i=1000时;
increment=0.9999834;
i+increment=1001.0
i=1001时;
increment=0.15343;
i+increment=1001.15344;
当再转为int存储在a中时
前一个为:1001
后一个为:1001
a中就有了重复数据