Java隨機數總結(第二部分)
四、Java隨機數的測試
通過一個例子說明上面的用法
- import java.util.Random;
- /**
- * Java隨機數測試
- * User: leizhimin
- * Date: 2008-11-19 17:52:50
- */
- public class TestRandomNum {
- public static void main(String[] args) {
- randomTest();
- testNoSeed();
- testSeed1();
- testSeed2();
- }
- public static void randomTest() {
- System.out.println("--------------test()--------------");
- //返回以毫秒為單位的當前時間。
- long r1 = System.currentTimeMillis();
- //返回帶正號的 double 值,大于或等于 0.0,小于 1.0。
- double r2 = Math.random();
- //通過Random類來獲取下一個隨機的整數
- int r3 = new Random().nextInt();
- System.out.println("r1 = " + r1);
- System.out.println("r3 = " + r2);
- System.out.println("r2 = " + r3);
- }
- public static void testNoSeed() {
- System.out.println("--------------testNoSeed()--------------");
- //創建不帶種子的測試Random對象
- Random random = new Random();
- for (int i = 0; i < 3; i++) {
- System.out.println(random.nextInt());
- }
- }
- public static void testSeed1() {
- System.out.println("--------------testSeed1()--------------");
- //創建帶種子的測試Random對象
- Random random = new Random(555L);
- for (int i = 0; i < 3; i++) {
- System.out.println(random.nextInt());
- }
- }
- public static void testSeed2() {
- System.out.println("--------------testSeed2()--------------");
- //創建帶種子的測試Random對象
- Random random = new Random();
- random.setSeed(555L);
- for (int i = 0; i < 3; i++) {
- System.out.println(random.nextInt());
- }
- }
- }
運行結果:
- --------------test()--------------
- r1 = 1227108626582
- r3 = 0.5324887850155043
- r2 = -368083737
- --------------testNoSeed()--------------
- 809503475
- 1585541532
- -645134204
- --------------testSeed1()--------------
- -1367481220
- 292886146
- -1462441651
- --------------testSeed2()--------------
- -1367481220
- 292886146
- -1462441651
- Process finished with exit code 0
通過testSeed1()與testSeed2()方法的結果可以看到,兩個打印結果相同,因為他們種子相同,再運行一次,結果還是一樣的,這就是帶種子隨機數的特性。而不帶種子的,每次運行結果都是隨機的。
五、Java隨機數的綜合應用
下面通過最近寫的一個隨機數工具類來展示用法:
- import java.util.Random;
- /**
- * 隨機數、隨即字符串工具
- * User: leizhimin
- * Date: 2008-11-19 9:43:09
- */
- public class RandomUtils {
- public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- public static final String numberChar = "0123456789";
- /**
- * 返回一個定長的隨機字符串(只包含大小寫字母、數字)
- *
- * @param length 隨機字符串長度
- * @return 隨機字符串
- */
- public static String generateString(int length) {
- StringBuffer sb = new StringBuffer();
- Random random = new Random();
- for (int i = 0; i < length; i++) {
- sb.append(allChar.charAt(random.nextInt(allChar.length())));
- }
- return sb.toString();
- }
- /**
- * 返回一個定長的隨機純字母字符串(只包含大小寫字母)
- *
- * @param length 隨機字符串長度
- * @return 隨機字符串
- */
- public static String generateMixString(int length) {
- StringBuffer sb = new StringBuffer();
- Random random = new Random();
- for (int i = 0; i < length; i++) {
- sb.append(allChar.charAt(random.nextInt(letterChar.length())));
- }
- return sb.toString();
- }
- /**
- * 返回一個定長的隨機純大寫字母字符串(只包含大小寫字母)
- *
- * @param length 隨機字符串長度
- * @return 隨機字符串
- */
- public static String generateLowerString(int length) {
- return generateMixString(length).toLowerCase();
- }
- /**
- * 返回一個定長的隨機純小寫字母字符串(只包含大小寫字母)
- *
- * @param length 隨機字符串長度
- * @return 隨機字符串
- */
- public static String generateUpperString(int length) {
- return generateMixString(length).toUpperCase();
- }
- /**
- * 生成一個定長的純0字符串
- *
- * @param length 字符串長度
- * @return 純0字符串
- */
- public static String generateZeroString(int length) {
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < length; i++) {
- sb.append('0');
- }
- return sb.toString();
- }
- /**
- * 根據數字生成一個定長的字符串,長度不夠前面補0
- *
- * @param num 數字
- * @param fixdlenth 字符串長度
- * @return 定長的字符串
- */
- public static String toFixdLengthString(long num, int fixdlenth) {
- StringBuffer sb = new StringBuffer();
- String strNum = String.valueOf(num);
- if (fixdlenth - strNum.length() >= 0) {
- sb.append(generateZeroString(fixdlenth - strNum.length()));
- } else {
- throw new RuntimeException("將數字" + num + "轉化為長度為" + fixdlenth + "的字符串發生異 常!");
- }
- sb.append(strNum);
- return sb.toString();
- }
- /**
- * 根據數字生成一個定長的字符串,長度不夠前面補0
- *
- * @param num 數字
- * @param fixdlenth 字符串長度
- * @return 定長的字符串
- */
- public static String toFixdLengthString(int num, int fixdlenth) {
- StringBuffer sb = new StringBuffer();
- String strNum = String.valueOf(num);
- if (fixdlenth - strNum.length() >= 0) {
- sb.append(generateZeroString(fixdlenth - strNum.length()));
- } else {
- throw new RuntimeException("將數字" + num + "轉化為長度為" + fixdlenth + "的字符串發生異 常!");
- }
- sb.append(strNum);
- return sb.toString();
- }
- public static void main(String[] args) {
- System.out.println(generateString(15));
- System.out.println(generateMixString(15));
- System.out.println(generateLowerString(15));
- System.out.println(generateUpperString(15));
- System.out.println(generateZeroString(15));
- System.out.println(toFixdLengthString(123, 15));
- System.out.println(toFixdLengthString(123L, 15));
- }
- }
運行結果:
- vWMBPiNbzfGCpHG
- 23hyraHdJkKPwMv
- tigowetbwkm1nde
- BPZ1KNEJPHB115N
- 000000000000000
- 000000000000123
- 000000000000123
- Process finished with exit code 0
六、總結
1、隨機數很常用,在Java有三種產生方式,以Random隨機數的使用最為復雜。
2、Random類對象有是否帶種子之分,帶種子的只要種子相同,多次運行,生成隨機數的結果總是那樣。
3、帶種子隨機數的帶種子的對象創建方式有兩種,效果一樣。但是帶種子的隨機數用處似乎不大。
4、Random的功能涵蓋了Math.random()的功能。
5、可以通過隨機數去做實現隨機字符串等復雜的隨機數據。
6、不要研究不重復的隨機數,意義不大。
【編輯推薦】