黑马程序员技术交流社区

标题: 有一个打乱数组元素的问题 [打印本页]

作者: 迦罗叶    时间: 2014-2-21 00:06
标题: 有一个打乱数组元素的问题
本帖最后由 迦罗叶 于 2014-2-21 14:09 编辑

这是两种打乱数组中元素的方法,第一种我自己写的,第二种别人写的。第二种我有一步看不懂,就是for循环里的index是随机
取到的值,那如果下次循环又随机到上次那个数,那不是有个数没换吗,求大神指点
import java.util.*;class Demo2{        public static void main(String[] args)         {                int[] arr={1,2,3,4,5,6,7};                //将这个数组打乱得到一个新的数组                int a =0;//记录新数组的角标                int[] newArr = new int[arr.length];                boolean[] base = new boolean[arr.length];//定义一个布尔类型的数组,因为初始值都是false                do                {                        Random r = new Random();                        int temp = r.nextInt(arr.length);//随机从0<= <arr.length中取一个值                        if(!base[temp])//作为入口,可以进去,控制如果下次取到就进不来                        {                                base[temp] = true;                                newArr[a++] = arr[temp];//将arr数组中的元素随机赋给newArr                        }                }                while (a<arr.length);                System.out.println(Arrays.toString(newArr));        }        pubic static void main(String[] args)        {                int arr ={1,2,3,4,5,6,7};                Random rd = new Random();//建立一个打乱数组的方法                                for (int x =0;x<arr.length-1 ;x++ )                {                        int index = r.nextInt(arr.length);//从arr数组中随机挑选一个角标值     //就是这一步开始迷糊index怕下一次又随机给到上个数?????                        int temp = 0;//定义一个第三方变量作为临时交换储存位置                        temp=arr[x];                        arr[x] = arr[index];                        arr[index] = temp;                }                System.out.println(Arrays.toString(arr));        }}


作者: 迦罗叶    时间: 2014-2-21 00:08
  1. import java.util.*;
  2. class Demo2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int[] arr={1,2,3,4,5,6,7};
  7.                 //将这个数组打乱得到一个新的数组
  8.                 int a =0;//记录新数组的角标
  9.                 int[] newArr = new int[arr.length];
  10.                 boolean[] base = new boolean[arr.length];//定义一个布尔类型的数组,因为初始值都是false
  11.                 do
  12.                 {
  13.                         Random r = new Random();
  14.                         int temp = r.nextInt(arr.length);//随机从0<= <arr.length中取一个值
  15.                         if(!base[temp])//作为入口,可以进去,控制如果下次取到就进不来
  16.                         {
  17.                                 base[temp] = true;
  18.                                 newArr[a++] = arr[temp];//将arr数组中的元素随机赋给newArr
  19.                         }
  20.                 }
  21.                 while (a<arr.length);
  22.                 System.out.println(Arrays.toString(newArr));
  23.         }
  24.         pubic static void main(String[] args)
  25.         {
  26.                 int arr ={1,2,3,4,5,6,7};
  27.                 Random rd = new Random();//建立一个打乱数组的方法
  28.                
  29.                 for (int x =0;x<arr.length-1 ;x++ )
  30.                 {
  31.                         int index = r.nextInt(arr.length);//从arr数组中随机挑选一个角标值
  32.                         int temp = 0;//定义一个第三方变量作为临时交换储存位置
  33.                         temp=arr[x];
  34.                         arr[x] = arr[index];
  35.                         arr[index] = temp;
  36.                 }
  37.                 System.out.println(Arrays.toString(arr));
  38.         }
  39. }
复制代码

作者: 徐老爹    时间: 2014-2-21 13:34
对于打乱顺序问题主要参考一个原则:需要被打乱的元素是否还在原来的容器中。
如果说是把原来的数据都取出来放到一个新的容器里,则必须按照第一种方法来做,因为避免数据的重复取出。
如果就在自身的容器里交换顺序,则不必考虑下次随机又遇到上一个数的问题,及时一个数字经过了所有循环以后依然在最开始的位置也是合理的(有它存在的概率),所以两种方法都可以。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2