Java生成隨機字符串,必須包含數字、小寫字母、大寫字母


一道算法題,生成隨機字符串,必須包含數字、小寫字母、大寫字母。

為了生成隨機數方便,特別編寫StdRandom類(注1),API如下。

public class StdRandom  
static double random() 0到1之間的實數 [0,1)
static  int uniform(int N) 0到N-1之間的整數[0,N)
static  int uniform(int lo,int hi) lo到hi-1之間的整數[lo,hi)
static  double uniform(double lo,double hi) lo到hi之間的實數[lo,hi)

 了解了StdRandom類API以后,就來看一下生成隨機字符串的RandomStr類是如何完成任務的。(輔助類StdRandom最后介紹。)

RandomStr.java

 1 public class RandomStr {
 2     
 3     /**
 4      * 單元測試
 5      * 運行: java RandomStr 4  (生成長度為4的字符串)
 6      */
 7     public static void main(String[] args){
 8         int len = Integer.parseInt(args[0]);;
 9         System.out.println(randomStr(len));
10     }
11     
12     /**
13      * 返回隨機字符串,同時包含數字、大小寫字母
14      * @param len 字符串長度,不能小於3
15      * @return String 隨機字符串
16      */
17     public static String randomStr(int len){
18         if(len < 3){
19             throw new IllegalArgumentException("字符串長度不能小於3");
20         }
21         //數組,用於存放隨機字符
22         char[] chArr = new char[len];
23         //為了保證必須包含數字、大小寫字母
24         chArr[0] = (char)('0' + StdRandom.uniform(0,10));
25         chArr[1] = (char)('A' + StdRandom.uniform(0,26));
26         chArr[2] = (char)('a' + StdRandom.uniform(0,26));
27         
28     
29         char[] codes = { '0','1','2','3','4','5','6','7','8','9',
30                          'A','B','C','D','E','F','G','H','I','J',
31                          'K','L','M','N','O','P','Q','R','S','T',
32                          'U','V','W','X','Y','Z','a','b','c','d',
33                          'e','f','g','h','i','j','k','l','m','n',
34                          'o','p','q','r','s','t','u','v','w','x',
35                          'y','z'};
36         //charArr[3..len-1]隨機生成codes中的字符
37         for(int i = 3; i < len; i++){
38             chArr[i] = codes[StdRandom.uniform(0,codes.length)];
39         }
40         
41         //將數組chArr隨機排序
42         for(int i = 0; i < len; i++){
43             int r = i + StdRandom.uniform(len - i);
44             char temp = chArr[i];
45             chArr[i] = chArr[r];
46             chArr[r] = temp;
47         }
48         
49         return new String(chArr);
50     }
51 }

 

看一下輔助類StdRandom。

StdRandom.java

 1 public final class StdRandom {
 2     
 3     //隨機數生成器
 4     private static Random random;
 5     //種子值
 6     private static long seed;
 7     
 8     //靜態代碼塊,初始化種子值及隨機數生成器
 9     static {
10         seed = System.currentTimeMillis();
11         random = new Random(seed);
12     }
13     
14     //私有構造函數,禁止實例化
15     private StdRandom() {}
16     
17     /**
18      * 設置種子值
19      * @param s 隨機數生成器的種子值
20      */
21     public static void setSeed(long s){
22         seed = s;
23         random = new Random(seed);
24     }
25     
26     /**
27      * 獲取種子值
28      * @return long 隨機數生成器的種子值
29      */
30     public static long getSeed(){
31         return seed;
32     }
33     
34     /**
35      * 隨機返回0到1之間的實數 [0,1)
36      * @return double 隨機數
37      */
38     public static double uniform(){
39         return random.nextDouble();
40     }
41     
42     /**
43      * 隨機返回0到N-1之間的整數 [0,N)
44      * @param N 上限
45      * @return int 隨機數
46      */
47     public static int uniform(int N){
48         return random.nextInt(N);
49     }
50     
51     /**
52      * 隨機返回0到1之間的實數 [0,1)
53      * @return double 隨機數
54      */
55     public static double random(){
56         return uniform();
57     }
58     
59     /**
60      * 隨機返回a到b-1之間的整數 [a,b)
61      * @param a 下限
62      * @param b 上限
63      * @return int 隨機數
64      */
65     public static int uniform(int a,int b){
66         return a + uniform(b - a);
67     }
68     
69     /**
70      * 隨機返回a到b之間的實數
71      * @param a 下限
72      * @param b 上限
73      * @return double 隨機數
74      */
75     public static double uniform(double a,double b){
76         return a + uniform() * (b - a);
77     }
78 }

 

注1:StdRandom類來自《算法(第4版)》 第一章 《基礎編程模型》, 作者 Robert Sedgewick 、 Kevin Wayne。本文中的StdRandom類是精簡版本,刪除了其他未用到的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM