Java生成隨機字串,必須包含數字、小寫字母、大寫字母
阿新 • • 發佈:2019-02-01
轉載,來源:http://www.cnblogs.com/dongliyang/archive/2013/04/01/2994554.html
一道演算法題,生成隨機字串,必須包含數字、小寫字母、大寫字母。
為了生成隨機數方便,特別編寫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
public class RandomStr { /** * 單元測試 * 執行: java RandomStr 4 (生成長度為4的字串) */ public static void main(String[] args){ int len = Integer.parseInt(args[0]);; System.out.println(randomStr(len)); } /** * 返回隨機字串,同時包含數字、大小寫字母 * @param len 字串長度,不能小於3 * @return String 隨機字串 */ public static String randomStr(int len){ if(len < 3){ throw new IllegalArgumentException("字串長度不能小於3"); } //陣列,用於存放隨機字元 char[] chArr = new char[len]; //為了保證必須包含數字、大小寫字母 chArr[0] = (char)('0' + StdRandom.uniform(0,10)); chArr[1] = (char)('A' + StdRandom.uniform(0,26)); chArr[2] = (char)('a' + StdRandom.uniform(0,26)); char[] codes = { '0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J', 'K','L','M','N','O','P','Q','R','S','T', 'U','V','W','X','Y','Z','a','b','c','d', 'e','f','g','h','i','j','k','l','m','n', 'o','p','q','r','s','t','u','v','w','x', 'y','z'}; //charArr[3..len-1]隨機生成codes中的字元 for(int i = 3; i < len; i++){ chArr[i] = codes[StdRandom.uniform(0,codes.length)]; } //將陣列chArr隨機排序 for(int i = 0; i < len; i++){ int r = i + StdRandom.uniform(len - i); char temp = chArr[i]; chArr[i] = chArr[r]; chArr[r] = temp; } return new String(chArr); } }
看一下輔助類StdRandom。
StdRandom.java
public final class StdRandom { //隨機數生成器 private static Random random; //種子值 private static long seed; //靜態程式碼塊,初始化種子值及隨機數生成器 static { seed = System.currentTimeMillis(); random = new Random(seed); } //私有建構函式,禁止例項化 private StdRandom() {} /** * 設定種子值 * @param s 隨機數生成器的種子值 */ public static void setSeed(long s){ seed = s; random = new Random(seed); } /** * 獲取種子值 * @return long 隨機數生成器的種子值 */ public static long getSeed(){ return seed; } /** * 隨機返回0到1之間的實數 [0,1) * @return double 隨機數 */ public static double uniform(){ return random.nextDouble(); } /** * 隨機返回0到N-1之間的整數 [0,N) * @param N 上限 * @return int 隨機數 */ public static int uniform(int N){ return random.nextInt(N); } /** * 隨機返回0到1之間的實數 [0,1) * @return double 隨機數 */ public static double random(){ return uniform(); } /** * 隨機返回a到b-1之間的整數 [a,b) * @param a 下限 * @param b 上限 * @return int 隨機數 */ public static int uniform(int a,int b){ return a + uniform(b - a); } /** * 隨機返回a到b之間的實數 * @param a 下限 * @param b 上限 * @return double 隨機數 */ public static double uniform(double a,double b){ return a + uniform() * (b - a); } }
注1:StdRandom類來自《演算法(第4版)》 第一章 《基礎程式設計模型》, 作者 Robert Sedgewick 、 Kevin Wayne。本文中的StdRandom類是精簡版本,刪除了其他未用到的方法。