创建随机不重复数组遇到的问题

最后将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中就有了重复数据

猜你喜欢

转载自blog.csdn.net/hooandlee/article/details/89438806
今日推荐