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 }