zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    不同等级数据源的多级缓冲环的生成
    从DataTable到List<Model>(C#.net)
    string与char之间的转换以及如何获得string所占位数
    AndroidKotlin
    Android高级POS开发
    IOS 应用开发
    Android切屏的处理
    Android POS开发
    Android深入理解JNI
    Android的IPC机制Binder
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/7445054.html
Copyright © 2011-2022 走看看