Java生成随机字符串,必须包含数字、小写字母、大写字母

时间:2021-11-04 09:11:59

一道算法题,生成随机字符串,必须包含数字、小写字母、大写字母。

为了生成随机数方便,特别编写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类是精简版本,删除了其他未用到的方法。