A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 迦罗叶 中级黑马   /  2014-2-21 00:06  /  1066 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 迦罗叶 于 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));        }}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
  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. }
复制代码
回复 使用道具 举报
对于打乱顺序问题主要参考一个原则:需要被打乱的元素是否还在原来的容器中。
如果说是把原来的数据都取出来放到一个新的容器里,则必须按照第一种方法来做,因为避免数据的重复取出。
如果就在自身的容器里交换顺序,则不必考虑下次随机又遇到上一个数的问题,及时一个数字经过了所有循环以后依然在最开始的位置也是合理的(有它存在的概率),所以两种方法都可以。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马