黑马程序员技术交流社区

标题: Random类的几个小疑问. [打印本页]

作者: 郑健初    时间: 2012-6-7 18:08
标题: Random类的几个小疑问.
import java.util.ArrayList;
import java.util.Random;
public class GetRandomList {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                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[i]);
                }
                Random rad =new Random(System.currentTimeMillis());//产生随机数
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){   //疑问1、我将brand.length改为al.size 得出结果长度会少几位?他们的长度应该一样才对啊
                        int index=rad.nextInt(brand.length-i);//疑问2、 对Random类不是很熟悉,Random()和nextInt()里面放的数会对产生的随机数有什么影响呢?
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }
}
这个程序我想实现类似随机洗牌的功能,通过查资料做出来的,所以有2个地方不太明白,
疑问1、我将brand.length改为al.size 得出结果长度会少几位?他们的长度应该一样才对啊。
疑问2、 对Random类不是很熟悉,Random()和nextInt()里面放的数会对产生的随机数有什么影响呢?
有空的朋友帮忙解答下呗,不胜感激。




作者: 杨康    时间: 2012-6-7 18:35
public static void main(String[] args) {
                // TODO Auto-generated method stub
                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[i]);
                }
                System.out.println(brand.length);//长度13
                System.out.println(al.size());//大小13   这两个就是一样大啊 不知道你是怎么写。

                Random rad =new Random(System.currentTimeMillis());//产生随机数
                System.out.println(rad);
                ArrayList randomArr=new ArrayList();//创建一个新集合来存储随即元素
                for(int i=0;i<brand.length;i++){   //疑问1、我将brand.length改为al.size 得出结果长度会少几位?他们的长度应该一样才对啊
                        int index=rad.nextInt(brand.length-i);//疑问2、 对Random类不是很熟悉,Random()和nextInt()里面放的数会对产生的随机数有什么影响呢?
                        randomArr.add(al.get(index));
                        al.remove(index);//去掉集合里已抽取的元素 避免重复
                }
                System.out.println(randomArr);
        }

下面再说一下Random()和nextInt()
Random()是构造方法,构造方法有两个其中一个是无参,另一个就是有参的Random(long seed),这个seed参数是伪随机数生成器的内部状态的初始值,调用 new Random(seed) 等效于:
Random rnd = new Random();
rnd.setSeed(seed);

nextInt()是方法,也有两个一个无参,一个有参:nextInt(int n) ,其中参数n的意思是指返回随机数的范围。
作者: 郑健初    时间: 2012-6-7 18:45
杨康 发表于 2012-6-7 18:35
public static void main(String[] args) {
                // TODO Auto-generated method stub
        ...

是将al.size()加入到第2个 for循环的判断条件中,得出长度不同




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