产生一个 由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;