当前位置: 代码迷 >> J2SE >> 用Math.random()产生13个0~51没有重复的随机数,放入suit数组中,该怎么解决
  详细解决方案

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

热度:2228   发布时间:2013-02-25 00:00:00.0
用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;
}
  相关解决方案