IT序号网

Java中随机数生成的问题

flyfish 2021年05月25日 编程语言 372 0

【生成随机数序列】

我们只能利用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     }

评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!