微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2SE >

用HashSet写生成随机数的方法为何不行?

时间:2014-04-15 11:12  浏览:努力统计中...
请高手帮忙看看,为何每次显示的都是1-10,而不是无序的数? importjava.util.HashSet; importjava.util.Iterator; publicclassDemo{ publicstaticHashSetIntegerset=newHashSetInteger(); //定义生成随机数列的方法 pub
请高手帮忙看看,为何每次显示的都是1-10,而不是无序的数?
import java.util.HashSet;
import java.util.Iterator;


public class Demo {

public static HashSet<Integer> set=new HashSet<Integer>();
  //定义生成随机数列的方法
    public static void randomSet(int min,int max,int range){
        int temp = (int)(Math.random()*(max-min+1)+min);
        set.add(temp);
        while(set.size()<range){
            randomSet(min,max,range);
          if(set.size()==range){
            break;
           }
        }
    }



public static void main(String[] args) {
randomSet(1,10,10);
Iterator it = set.iterator();
/* while(it.hasNext()){
System.out.println(it.next());
}*/
System.out.println("开始打印hashset");
for(int i:set){
System.out.println(i);
}


}
}


1-10的哈西值正好是这个顺序,你把长度加到100看看

问题好像不少,
1.程序生成随机数的功能无法实现你所希望的;
2.每次都是1-10,那是因为HashSet内部其实是调用HashMap实现的,HashSet里面的value作为HasHMap的key,
HashMap默认容量是16,1-10的随机数对16取模来决定数组下标,当然是按着顺序1-10;

改了一下,换成List来实现你想要的功能:

import java.util.ArrayList;
import java.util.List;

public class Demo {

private static List<Integer> list=new ArrayList<Integer>();

    //定义生成随机数列的方法
  public static void randomSet(int min,int max,int range){
      int temp = (int)(Math.random()*(max-min+1)+min);
      if(!list.contains(temp))
      {
       list.add(temp);  
      }
      
      if(list.size()<range){
          randomSet(min,max,range);
      }
  }
     
  public static void main(String[] args) {
      randomSet(1,10,10);
    
      System.out.println("==========================================");
      
      for(int temp:list)
      {
       System.out.println(temp);
      }              
  }

}


你调用的那个方法做测试毫无意义,因为HashSet本身就是无序的,你应该换成List去测试。
HashSet是按Hash算法通过HashCode去排序的,你输入的1-10的哈希算法顺序刚好是自然数顺序才会让你觉得它排序了,你放100以上的数试试就知道了。

你这个和hash set 没什么随机 的关系。Math.random()*(max-min+1)+min
你已经限制范围了。
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%
    ------分隔线------