黑马程序员技术交流社区

标题: Random的小问题 [打印本页]

作者: 宋浩    时间: 2012-6-8 12:30
标题: Random的小问题
import java.util.ArrayList;
import java.util.Random;
public class GetRandomList {

        public static void main(String[] args) {
         
                String[] brand = { "A","2","3","4","5","6","7","8","9","10","J","Q","K"} ;
                ArrayList al=new ArrayList();//用ArrayList集合来存储brand里面的元素
                for(int i=0;i<brand.length;i++){
                        al.add(brand);
                }
                Random rad =new Random(System.currentTimeMillis());//产生随机数
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }
}
洗牌的功能,有一个疑问,就是为什么在做第二个for循环的时候,如果将brand.length改成al.size()得到的
结果长度总会少几位,这两个值不是应该相等吗?很疑惑~!

作者: 曹操    时间: 2012-6-8 12:41
本帖最后由 曹昌 于 2012-6-8 12:50 编辑

因为length和size()的针对性不同!

java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.

java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法.

java中的size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看!

import java.util.ArrayList;
import java.util.Random;
public class GetRandomList {

        public static void main(String[] args) {
         
                String[] brand = { "A","2","3","4","5","6","7","8","9","10","J","Q","K"} ;
                ArrayList al=new ArrayList();//用ArrayList集合来存储brand里面的元素
                for(int i=0;i<brand.length;i++){
                        al.add(brand);
                }
                Random rad =new Random(System.currentTimeMillis());//产生随机数
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }
}



作者: 赵兵锋    时间: 2012-6-8 13:04
  1. for(int i=0;i<al.size();i++){  //i在自增,al的size在减小,所以这个循环会提前结束,不会有13次。
  2.                         int index=rad.nextInt(al.size()-i);
  3.                         randomArr.add(al.get(index));
  4.                         al.remove(index);//移除元素后,al的size会减一。
  5.                 }
复制代码
改后的代码:
  1. while(al.size()>0){//当al的size变为0时就表示13张牌都取完了。
  2.                 int index=al.size()>1?rad.nextInt(al.size()-1):0;//当al的size为1时,减一后为0,nextInt(n)中的n必须为正整数,所以这里判断了一下,al的size为1时,直接取索引为0
  3.                 randomArr.add(al.get(index));
  4.                 al.remove(index);
  5.         }
复制代码

作者: 葛奎    时间: 2012-6-8 13:20
for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//这个语句是删除al中index位置的元素 避免了重复,
                                                 //当它删除元素后,它里面的元素个数会自动地减少,al.size()随着变化.而brand里面的元素个数是固定的,brand.length是不变的
                                                  
                }
作者: 付信榕    时间: 2012-6-8 14:11
楼主给的代码有错呀,改正之后如下:
import java.util.ArrayList;
import java.util.Random;
public class GetRandomList {

        public static void main(String[] args) {
         
                String[] brand = { "A","2","3","4","5","6","7","8","9","10","J","Q","K"} ;
                ArrayList al=new ArrayList();//用ArrayList集合来存储brand里面的元素
                for(int i=0;i<brand.length;i++){
                        al.add(brand);//应该是al.add(brand);
                }
                Random rad =new Random(System.currentTimeMillis());//产生随机数
// 应该是:使用单个 long 种子创建一个新的随机数生成器
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){  
                        int index=rad.nextInt(brand.length-i);
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }
}








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