Java获取随机数获取制定范围指定个数不重复的随机数

简介:

一.JDK中提供的两种方式

1.Math类中的random()方法
public static double random()
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0 [0.0,1.0)。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。

2.Random类中的 nextInt()方法
public int nextInt()
返回一个随机数,所有 2的32次方个可能 int 值的生成概率(大致)相同。


public int nextInt(int n)
返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。 
nextInt 的常规协定是,伪随机地生成并返回指定范围中的一个 int 值。所有可能的 n 个 int 值的生成概率(大致)相同。

参数:
n - 要返回的随机数的范围。必须为正数。
返回:
随机数生成器序列中 0(包括)和 n(不包括)之间  [0,n) 均匀分布的 int 值。
抛出:
IllegalArgumentException - 如果 n 不是正数

StackOverFlow总结的的经典的回答:

https://stackoverflow.com/questions/363681/how-do-i-generate-random-integers-within-a-specific-range-in-java

二.随机获取制定范围的制定个数的随机数

上代码:

复制代码
  1 import java.util.HashSet;
  2 import java.util.Random;
  3 
  4 public class GenerateRandomNumber {
  5     
  6     public static void main(String[] args) {
  7         //一、JAVA中生成随机数的方式
  8         //  9         //int randomNumber = (int) Math.round(Math.random()*(max-min)+min); 
 10         
 11         // 12         //long randomNum = System.currentTimeMillis();  
 13         //int randomNumber = (int) randomNum%(max-min)+min; 
 14         
 15         // 16         //Random random = new Random();  
 17         //int randomNumber =  random.nextInt(max)%(max-min+1) + min;        
 18 
 19 //方法一:最简单最易理解的两重循环去重  
 20 //        int[] reult1 = randomCommon(20, 50, 10);
 21 //        for (int i : reult1) {
 22 //            System.out.println(i);
 23 //        }
 24 
 25 //方法二:利用HashSet的特征,只能存放不同的值  
 26 //        HashSet<Integer> set = new HashSet<Integer>();
 27 //        randomSet(20, 50, 10, set);
 28 //        for (int j : set) {
 29 //            System.out.println(j);
 30 //        }
 31 
 32 //方法三:排除已随机到的数  
 33       int[] reult2 = randomArray(0, 20, 18);
 34 //      for (int i : reult2) {
 35 //          System.out.println(i);
 36 //      }        
 37 }      
 38     
 39     //二、随机给定范围内N个不重复的数
 40     /** 
 41      * 方法一:最简单最易理解的两重循环去重  
 42      * 随机指定范围内N个不重复的数 
 43      * 最简单最基本的方法 
 44      * @param min 指定范围最小值 
 45      * @param max 指定范围最大值 
 46      * @param n 随机数个数 
 47      */  
 48     public static int[] randomCommon(int min, int max, int n){  
 49         if (n > (max - min + 1) || max < min) {  
 50                return null;  
 51            }  
 52         int[] result = new int[n];  
 53         int count = 0;  
 54         while(count < n) {  
 55             int num = (int) (Math.random() * (max - min)) + min;  
 56             boolean flag = true;  
 57             for (int j = 0; j < n; j++) {  
 58                 if(num == result[j]){
 59                     flag = false;  
 60                     break;  
 61                 }  
 62             }  
 63             if(flag){  
 64                 result[count] = num;  
 65                 count++;  
 66             }  
 67         }  
 68         return result;  
 69     }  
 70     
 71     /** 
 72      * 方法二:利用HashSet的特征,只能存放不同的值  
 73      * 随机指定范围内N个不重复的数 
 74      * 利用HashSet的特征,只能存放不同的值 
 75      * @param min 指定范围最小值 
 76      * @param max 指定范围最大值 
 77      * @param n 随机数个数 
 78      * @param HashSet<Integer> set 随机数结果集 
 79      */  
 80        public static void randomSet(int min, int max, int n, HashSet<Integer> set) {  
 81            if (n > (max - min + 1) || max < min) {  
 82                return;  
 83            }  
 84            for (int i = 0; i < n; i++) {  
 85                // 调用Math.random()方法  
 86                int num = (int) (Math.random() * (max - min)) + min;  
 87                set.add(num);// 将不同的数存入HashSet中  
 88            }  
 89            int setSize = set.size();  
 90            // 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小  
 91            if (setSize < n) {  
 92             randomSet(min, max, n - setSize, set);// 递归  
 93            }  
 94        }  
 95        
 96     /** 
 97      * 方法三:排除已随机到的数  
 98      * 随机指定范围内N个不重复的数 
 99      * 在初始化的无重复待选数组中随机产生一个数放入结果中, 
100      * 将待选数组被随机到的数,用待选数组(len-1)下标对应的数替换 
101      * 然后从len-2里随机产生下一个随机数,如此类推 
102      * @param max  指定范围最大值 
103      * @param min  指定范围最小值 
104      * @param n  随机数个数 
105      * @return int[] 随机数结果集 
106      */  
107     public static int[] randomArray(int min,int max,int n){
108         //min=20 max=40 n=10 
109         int len = max-min+1;  
110           
111         if(max < min || n > len){  
112             return null;  
113         }  
114           
115         //初始化给定范围的待选数组  
116         int[] source = new int[len];  
117            for (int i = min; i < min+len; i++){  
118             source[i-min] = i;  
119            }
120            //source 初始化之后就是min~max(包括首尾) 之间的所有数字的一个数组.[20,21...,10]
121              
122            int[] result = new int[n];  
123            Random random = new Random();  
124            int index = 0;  
125            for (int i = 0; i < result.length; i++) {  
126                System.out.println("第"+i+"次循环");
127                
128                int randomInt = random.nextInt();
129                int maxEffectiveArraySubScript = len--;//最大有效数组下标,数组中超过这个下标的值都没有用了...
130                //待选数组0到(len-2)随机一个下标    除数(maxEffectiveArraySubScript) 取余 范围为(0~maxEffectiveArraySubScript-1)
131                //即(0~maxEffectiveArraySubScript-1) <==> 0到(len-2)
132                index = Math.abs(randomInt % maxEffectiveArraySubScript ); 
133                
134                System.out.println("randomInt:"+randomInt+",原数组最大有效角标:"+maxEffectiveArraySubScript+",index:"+index);
135                System.out.println("原数组有效检索子数组:");
136                printArray(source,maxEffectiveArraySubScript);
137                System.out.println("");
138                
139                //将随机到的数放入结果集  
140                result[i] = source[index];
141                System.out.println("找到的数为:"+result[i]);
142                //将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换 ,这样确保"有效检索子数组"中后面没有检索到的数据前移,下一次仍可能随机找到.
143                //因为每一次循环 原数组的有效长度都是-1的...
144                source[index] = source[len];
145                
146                System.out.println("原数组变成:");
147                printArray(source);
148                System.out.println("");
149                System.out.println("目标数组为:");
150                printArray(result);
151                System.out.println("");
152            }  
153            return result;  
154     }
155     
156     public static void printArray(int []  intArray){
157         for (int i = 0; i < intArray.length; i++) {
158             System.out.print(intArray[i]+",");
159         }
160     }
161     
162     public static void printArray(int []  intArray,int maxArrayNum){
163         for (int i = 0; i < maxArrayNum; i++) {
164             System.out.print(intArray[i]+",");
165         }
166     }
167 }
复制代码

 

 

 方法三:相对有点不好理解,我加上了打印内容.方便理解.

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/7445054.html,如需转载请自行联系原作者

相关文章
|
7月前
|
Java
Java产生随机数
Java产生随机数
77 0
|
4月前
|
Java
Java系类 之 生成随机数(random()和Random类)
这篇文章介绍了Java中生成随机数的两种方法:使用`Math.random()`方法和`Random`类的实例方法,并提供了示例代码展示如何使用这些方法生成特定范围或特定条件下的随机数。
|
7月前
|
Java
java_键盘录入、随机数
本文介绍了Java中键盘录入和Random类的使用。键盘录入用于从用户那里获取数据,通过导入`java.util.Scanner`,创建`Scanner`对象,调用`nextInt()`或`nextDouble()`读取整数和小数,`next()`读取字符串。Random类用于生成随机整数,导入该类后创建对象,调用`nextInt(int bound)`生成[0, bound-1]范围内的随机数。在JDK17及以上版本,可以使用`nextInt(int start, int end)`生成[start, end)范围的随机数。常见应用包括猜数字游戏和随机点名。
68 0
|
6月前
|
存储 安全 Java
Java生成随机数的代码和方法
Java生成随机数的代码和方法
172 6
|
6月前
|
Java
使用java文件过滤器输出制定格式文件路径
使用java文件过滤器输出制定格式文件路径
|
6月前
|
算法 安全 Java
什么是Java伪随机数,基础打牢。 #程序员 #Java #编程
什么是Java伪随机数,基础打牢。 #程序员 #Java #编程
37 0
|
7月前
|
存储 Java
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
103 0
|
安全 Java 数据安全/隐私保护
java random随机数的用法
java random随机数的用法
|
7月前
|
Java API
Java的Math.random获取区间随机数
Java的Math.random获取区间随机数
下一篇
DataWorks