用Math.random()产生13个0~51没有重复的随机数,放入suit数组中,该怎么解决

用Math.random()产生13个0~51没有重复的随机数,放入suit数组中
这段书中的例题,理解起来有点吃力
Java code


class Welcome
{
    public static void main(String[] args)
    {
        int key;
        int[] suit=new int[13];
        boolean[] sw=new boolean[52]; //这个sw数组要怎么用搞不懂
        for(int i=0;i<suit.length;i++)
        {
            while(true)//这一循环是用来判断产生的数有咩有重复的吗,但里面的内容看不懂
            {
                key=(int)(Integer.MAX_VALUE*Math.random()*10)%sw.length;//这一句好复杂,不知道干了什么QAQ
                if(sw[key]==false)
                    break;
            }
            suit[i]=key;
            sw[key]=true;
        }
        for(int i=0;i<suit.length;i++)
        {
            System.out.print(suit[i]+" ");
        }
        System.out.println();
    }
}


前辈们指点一下啊,谢谢

------解决方案--------------------
boolean[] sw
这个数组其实就是用来取1-51的数来用的
取的是下标,取过的会存为false,每次判断是不是false来取数
key=(int)(Integer.MAX_VALUE*Math.random()*10)%sw.length;
这个是随机数,然后除以52来取余数,余数为1-51之间的数。。。。
其实就是用来取下标的
------解决方案--------------------
这里理解或许容易些,应用到Hashmap.代码如下:
Java code

Set<Integer> set = new HashSet<Integer>();
        Random random = new Random();
        while (set.size() < 13) {//取得13个
            set.add(random.nextInt(51));//0-51范围数据
        }
        Iterator<Integer> it = set.iterator();
        List<Object> suit=new ArrayList<Object>(); 
        String matter="";
        for(;it.hasNext();){
            // matter+=it.next().toString()+"  ";
             suit.add(it.next());//切记不能两个一起添加,这样会认为迭代2次,会报异常错误:NoSuchElementException
        }
        System.out.println(matter);//或则直接这样输出
        for(int i=0;i<suit.size();i++)
        {
            System.out.println(suit.get(i));
        }

------解决方案--------------------
boolean[] sw=new boolean[52]; //这个sw数组要怎么用搞不懂这个是用来判断是否存在某个数的数组,比如随机取了一个数,2那么sw[2] = true;表示2已经有了

while(true)//这一循环是用来判断产生的数有咩有重复的吗,但里面的内容看不懂
{
key=(int)(Integer.MAX_VALUE*Math.random()*10)%sw.length;//这一句好复杂,不知道干了什么QAQ(随机产生0-51的整数)
if(sw[key]==false)//判断产生的数是否存在
break;
}
suit[i]=key;//如果不存在就把数据放入到suit当中
sw[key]=true;//并且不对应位置设置为true以表示该数已经存在了
这里是用来取13个不重复的0-51的数。
------解决方案--------------------
探讨

引用:

boolean[] sw
这个数组其实就是用来取1-51的数来用的
取的是下标,取过的会存为false,每次判断是不是false来取数
key=(int)(Integer.MAX_VALUE*Math.random()*10)%sw.length;
这个是随机数,然后除以52来取余数,余数为1-51之间的数。。。。
其实就是用来取下标的

为什么这里……

------解决方案--------------------
探讨
boolean[] sw
这个数组其实就是用来取1-51的数来用的
取的是下标,取过的会存为false,每次判断是不是false来取数
key=(int)(Integer.MAX_VALUE*Math.random()*10)%sw.length;
这个是随机数,然后除以52来取余数,余数为1-51之间的数。。。。
其实就是用来取下标的

------解决方案--------------------
boolean[] sw=new boolean[52]; //这个sw数组要怎么用搞不懂
这个数组里的52个标记都初始化为false,
while(true)//这一循环是用来判断产生的数有咩有重复的吗,但里面的内容看不懂
此循环用于获取0~51间的数
{
key=(int)(Integer.MAX_VALUE*Math.random()*10)%sw.length;//这一句好复杂,不知道干了什么QAQ
//用一任意整数除52取余,得到0-51间的数
if(sw[key]==false)
break;
}