我想得到一个不重复的4位数,写了下边的东西,结果运行后让我大吃一惊public class Random { public static void main(String[] args) {

System.out.println((int)(Math.random()*10));

Collection  set = new HashSet();
for(int i =1 ; i<5 ; i++){
set.add((int)(Math.random()*10));
}

Iterator i = set.iterator();

while(i.hasNext()){
System.out.println(i.next());
}
}
}
结果12
1
2
3
4
结果23
3
4
8
求解释!

解决方案 »

  1.   

    Math.random()是获取一个大于0小于1的数你产生了两次第一次和第二次打印的东西完全不同因为你是生成的2组随机数
      

  2.   

    记错了~不好意思:  set --其中的值不允许重复,无序的数据结构
      list --其中的值允许重复,因为其为有序的数据结构
      map--成对的数据结构,健值必须具有唯一性(键不能同,否则值替换) 
      

  3.   

    set是没有顺序的 不能有重复值 每次输出可能是不一样的顺序啊
      

  4.   

    你try一下,看看有没有抛异常
      

  5.   

    LinkedHashSet可以保证你存入集合的顺序
      

  6.   

    Math.random()返回的是double类型,Set的不重复是根据放入object的hashcode做判断
      

  7.   

    你感觉奇怪的应该是HashSet输出了重复的元素,这是因为你遍历集合的API调用用的是iterator,用下面这个遍历吧,这样逻辑就正常了
    public class Random {    public static void main(String[] args) {//        System.out.println((int)(Math.random()*10));        Collection set = new HashSet();
            for(int i =1 ; i<5 ; i++){
                int tmp=(int)(Math.random()*10);
                set.add(tmp);
                System.out.println("set add"+tmp);
            }        for(Object o:set){
                System.out.println(o); 
            }//        Iterator i = set.iterator();
    //
    //        while(i.hasNext()){
    //            System.out.println(i.next());
    //        }
        }
    }
      

  8.   

    没错呀,你不就是想得到随机数吗? 你set.add()时相同的就没加进去,所以有时是3个,有时是4个
      

  9.   

    你重复是因为你上边  System.out.println((int)(Math.random()*10));
    所以第一个和第二个总是重复
      

  10.   

    楼上的能说下iterator为啥会造成这种结果么 ,在SET里面装的时无重复的值,怎么迭代出来却不是这样呢
      

  11.   

    没有任何问题的
    第一个数是你main开始就打印的一个数
    后面的四个或三个数才是set里面的,没有重复啊
      

  12.   

    同意楼上!
    System.out.println((int)(Math.random()*10));
      

  13.   

    我又做了下实验,楼主的遍历方法跟for的方法应该在逻辑上都是正确的,之所以出现楼主说的情况,我想可能是编译器出错了,楼主你再多运行几次,是不是就很少碰上Set有重复元素的情况?
      

  14.   

    这和接口Set机制有关,
    如果 set 中尚未存在指定的元素,则添加此元素,反之有则不添加了。所以才会出现不定数量值。
      

  15.   

      第一 ,楼主得到的随机数是一个int基本类型的 而是Set加入的元素是无序不重复的,所谓不重复是通过元素的equals()方法比较的几个,楼主不妨试一下定义一个 int a = 2;你会发现a不能调用equals方法,所以建议楼主将随机数封装成一个Integer:Integer a = new Integer(new Double((Math.random()*10)).intValue());  第二 ,楼主想得到一个不重复的4为数,楼主思路也是有问题的,你随机4次未必能取得4个不一样的数,或许2个一样、3个一样,4个一样都有可能!楼主不妨把代码改成如下,便可以实现你想要的结果。  
    public static void main(String[] args) {
        Collection  set = new HashSet();
        for(int i =1 ; i<5 ; ){
         Integer a = new Integer(new Double((Math.random()*10)).intValue());
         if(!set.contains(a)){
          set.add(a);
          i++;
         }
            
        }
        Iterator i = set.iterator();
        while(i.hasNext()){
            System.out.println(i.next());
        }
    }
      

  16.   

    public class Random {    public static void main(String[] args) {
            
            System.out.println((int)(Math.random()*10));
            
            Collection  set = new HashSet();
            while(set.size()<5){
                set.add((int)(Math.random()*10));
            }
            
            Iterator i = set.iterator();
            
            while(i.hasNext()){
                System.out.println(i.next());
            }
        }
    }