Java中随机数生成的问题

【生成随机数序列】

我们只能利用Math.random()方法只能生成一个在[0,1)之间的double类型浮点数。

但如果我们想要生成[min, max]之间的随机整数时该怎么办呢?

此时可以用:

1   int rdmNum = (int) (Math.random() * (max + 1 - min) + min);

【随机数生成器(存在重复随机数)】

 1   public static int[] createRandomArray(int arrLength, int rdmMin, int rdmMax) {
 2      //根据所给数组长度,生成所要的数组
 3       int[] arr = new int[arrLength];
 4      //给数组赋随机值
 5       for (int i = 0; i < arr.length; i++) {
 6           arr[i] = (int) (Math.random() * (rdmMax + 1 - rdmMin) + rdmMin);
 7       }
 8      //返回这个数组
 9       return arr;
10   }

【不重复随机数生成器】

该方法可以返回一个在[rdmMin,rdmMax]范围内的随机整数数组,实测[1, 300000]内随机数组生成耗时10476毫秒,效率不错

 1     // 该方法可以返回一个在[rdmMin,rdmMax]范围内的随机整数数组,效率极高
 2     public static int[] createRandomNoRepeatArray(int arrLength, int rdmMin, int rdmMax) {
 3         // 显然,我们不能创建一个长度为100,元素随机范围为1~10的数组,并且还指望它不重复。。。
 4         // 所以我们的数组长度不能大于随机数范围长度!
 5         // 创建指定长度的数组
 6         if(arrLength > (rdmMax - rdmMin + 1)){
 7             System.out.println("数组长度不能大于随机数范围长度!");
 8             // 程序停止运行
 9             System.exit(0);
10         }
11         int[] rdmArr = new int[arrLength];
12         // 创建一个有序集合,随机数从中挑选
13         List<Integer> rdmNum = new ArrayList<Integer>();
14         // 将随机范围内的整数赋给该集合,此时显然该集合中的元素不重复
15         for (int i = rdmMin; i <= rdmMax; i++) {
16             rdmNum.add(i);
17         }
18         // 此时给指定数组赋值赋的是随机索引中的元素
19         for (int i = 0; i < rdmArr.length; i++) {
20             // 生成随机索引,这里生成的随机索引范围应该逐次减1
21             int index = (int) (Math.random() * (rdmMax - rdmMin + 1 - i));
22             // 根据随机索引获取元素
23             rdmArr[i] = rdmNum.get(index);
24             // 删除该索引的元素。删除后,后者元素自动向前补位,List集合长度减1。
25             rdmNum.remove(index);
26         }
27         return rdmArr;
28     }

 【不重复随机数生成器2】

返回值类型为HashSet<Integer>,再转为int[]数组性能就会下降一些,有时候也没必要非用int[]数组

生成[1,2000000]之间的随机数耗时12580毫秒,这个是目前效率最高的。

 1     public static HashSet<Integer> createRandomSet(int arrLength, int rdmMin, int rdmMax) {
 2         // 实例化一个HashSet集合
 3         HashSet<Integer> hs = new HashSet<Integer>();
 4         
 5         while (hs.size() != arrLength) {
 6             // 循环赋指定范围内的随机值
 7             hs.add((int) (Math.random() * (rdmMax + 1 - rdmMin) + rdmMin));
 8         }
 9         return hs;
10     }

 

posted @ 2018-02-10 22:00  Schiller_Hu  阅读(367)  评论(0编辑  收藏  举报