package com.y541028105;import java.util.HashSet;
import java.util.Set;public class RandomMySelf {

/** 
 * 随机指定范围内N个不重复的数 
 * 利用HashSet的特征,只能存放不同的值 
 * @param min 指定范围最小值 
 * @param max 指定范围最大值 
 * @param n 随机数个数 
 * @param HashSet<Integer> set 随机数结果集 
 */  
   public void randomSet(int min, int max, int n, HashSet<Integer> set) {  
       if (n > (max - min + 1) || max < min) {  
           return;  
       }  
       for (int i = 0; i < n; i++) {  
           // 调用Math.random()方法  
           int num = (int) (Math.random() * (max - min)) + min;  
           set.add(num);// 将不同的数存入HashSet中  
       }  
       int setSize = set.size();  
       // 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小  
       if (setSize < n) {  
        randomSet(min, max, n - setSize, set);// 递归  
       }  
   }  
   
   public static void main(String args[]){
   RandomMySelf randomMySelf = new RandomMySelf();
   HashSet<Integer> hashSet  = new HashSet<Integer>();
   randomMySelf.randomSet(1000,9999,1000,hashSet);
   for (Integer integer:hashSet) {
  System.out.println(integer);
}
   }
   
}
这是代码 为什么 我选择了从1000到9999生成1000个随机数 但是实际上只生成了994个?求大神解释。Javahashset

解决方案 »

  1.   

    HashSet不能添加重复的元素
    你把HashSet换成ArrayList就不会这样了
      

  2.   

    很简单的道理,生成了1000个,但HashSet值不允许重复。。所以。。长度不能确定。。994是你一次试验的结果吧?
      

  3.   

    哦,你是要存不重复的数
    那就在每次插入前hashset.contains(xxx)判断是否重复,重复了就再取一次
      

  4.   

    你那段for循环这样改就行了for (int i = 0; i < n; i++) {  
                  // 调用Math.random()方法  
                  int num = (int) (Math.random() * (max - min)) + min;  
                  while (set.contains(num)) {
                   num = (int) (Math.random() * (max - min)) + min;
                  }
                  set.add(num);// 将不同的数存入HashSet中  
              }