标签:不重复 随机数组
产生一个 由0到99之间的数组成,元素各不相同的无序的一个长度为100的数组。
其实换句话说,就是把一个 由0到100之间的一个 连续的数组给打散。
由三种方式。
一:使用List 和随机数
// long s1 = System.currentTimeMillis(); // List ar = new ArrayList(); // for (int i = 0; i < 100000; i++) { // ar.add(i); // } // int [] toArray = new int[100000]; // // for(int j = 100000; j >0; j--){ // double d = (Math.random()*j); // int index = (int)d; // toArray[j-1]= (int)ar.get(index); // ar.remove(ar.get(index)); // } // long s2 = System.currentTimeMillis(); // System.out.println("S2-S1用时:"+(s2 - s1)); //S2-S1:14881
二.通过对原来数组元素位置的交换,而不是把原来集合中的元素移除,来产生无序数组
long s1 = System.currentTimeMillis(); int [] ar = new int[100]; for (int i = 0; i < 100; i++) { ar[i]=i; } int [] toArray = new int[100]; for(int j = 100; j >0; j--){ int index = (int)(Math.random()*j); toArray[j-1]= ar[index]; int temp = ar[index]; ar[index] = ar[j-1]; ar[j-1] = temp; } long s2 = System.currentTimeMillis(); System.out.println("S2-S1:"+(s2 - s1));
三: 给原来数组的每个元素定义一个开关, 通过开关判断元素是否重复,如果重复 会继续产生随机数,知道不重复为止
long s1 = System.currentTimeMillis(); //计数器 标记这个方法一共循环多少次 int c = 0; //这是0-99个数 int[] iqs = new int[100000]; for (int i = 0; i < 100000; i++) { iqs[i] = i; } //这是随机数组 int[] sb = new int[100000]; //设置开关 boolean[] b = new boolean[100000]; //赋值 for (int i = 0; i < 100000; i++) { // 遍历iqs数组 int index; do { c++; index = (int) (Math.random() * iqs.length); // iqs数组的随机下标 } while (b[index] == true); // b[index]为true代码生成过对应字符,则重新生成下标 sb[i] = iqs[index]; // 取出iqs中的元素赋值给sb中的每一个元素 b[index] = true; // true代表已生成过 } System.out.println(c); long s2 = System.currentTimeMillis(); System.out.println(s2 - s1); return sb;
本文出自 “JAVA那些事儿” 博客,请务必保留此出处http://1027187712.blog.51cto.com/5509347/1628020
标签:不重复 随机数组
原文地址:http://1027187712.blog.51cto.com/5509347/1628020