一道算法題,生成隨機字符串,必須包含數字、小寫字母、大寫字母。
為了生成隨機數方便,特別編寫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類是精簡版本,刪除了其他未用到的方法。