Java隨機(jī)數(shù)總結(jié)(第二部分)
四、Java隨機(jī)數(shù)的測試
通過一個例子說明上面的用法
- import java.util.Random;
- /**
- * Java隨機(jī)數(shù)測試
- * 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()--------------");
- //返回以毫秒為單位的當(dāng)前時間。
- long r1 = System.currentTimeMillis();
- //返回帶正號的 double 值,大于或等于 0.0,小于 1.0。
- double r2 = Math.random();
- //通過Random類來獲取下一個隨機(jī)的整數(shù)
- 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()--------------");
- //創(chuàng)建不帶種子的測試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()--------------");
- //創(chuàng)建帶種子的測試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()--------------");
- //創(chuàng)建帶種子的測試Random對象
- Random random = new Random();
- random.setSeed(555L);
- for (int i = 0; i < 3; i++) {
- System.out.println(random.nextInt());
- }
- }
- }
運(yùn)行結(jié)果:
- --------------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()方法的結(jié)果可以看到,兩個打印結(jié)果相同,因為他們種子相同,再運(yùn)行一次,結(jié)果還是一樣的,這就是帶種子隨機(jī)數(shù)的特性。而不帶種子的,每次運(yùn)行結(jié)果都是隨機(jī)的。
五、Java隨機(jī)數(shù)的綜合應(yīng)用
下面通過最近寫的一個隨機(jī)數(shù)工具類來展示用法:
- import java.util.Random;
- /**
- * 隨機(jī)數(shù)、隨即字符串工具
- * 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";
- /**
- * 返回一個定長的隨機(jī)字符串(只包含大小寫字母、數(shù)字)
- *
- * @param length 隨機(jī)字符串長度
- * @return 隨機(jī)字符串
- */
- 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();
- }
- /**
- * 返回一個定長的隨機(jī)純字母字符串(只包含大小寫字母)
- *
- * @param length 隨機(jī)字符串長度
- * @return 隨機(jī)字符串
- */
- 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();
- }
- /**
- * 返回一個定長的隨機(jī)純大寫字母字符串(只包含大小寫字母)
- *
- * @param length 隨機(jī)字符串長度
- * @return 隨機(jī)字符串
- */
- public static String generateLowerString(int length) {
- return generateMixString(length).toLowerCase();
- }
- /**
- * 返回一個定長的隨機(jī)純小寫字母字符串(只包含大小寫字母)
- *
- * @param length 隨機(jī)字符串長度
- * @return 隨機(jī)字符串
- */
- 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();
- }
- /**
- * 根據(jù)數(shù)字生成一個定長的字符串,長度不夠前面補(bǔ)0
- *
- * @param num 數(shù)字
- * @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("將數(shù)字" + num + "轉(zhuǎn)化為長度為" + fixdlenth + "的字符串發(fā)生異 常!");
- }
- sb.append(strNum);
- return sb.toString();
- }
- /**
- * 根據(jù)數(shù)字生成一個定長的字符串,長度不夠前面補(bǔ)0
- *
- * @param num 數(shù)字
- * @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("將數(shù)字" + num + "轉(zhuǎn)化為長度為" + fixdlenth + "的字符串發(fā)生異 常!");
- }
- 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));
- }
- }
運(yùn)行結(jié)果:
- vWMBPiNbzfGCpHG
- 23hyraHdJkKPwMv
- tigowetbwkm1nde
- BPZ1KNEJPHB115N
- 000000000000000
- 000000000000123
- 000000000000123
- Process finished with exit code 0
六、總結(jié)
1、隨機(jī)數(shù)很常用,在Java有三種產(chǎn)生方式,以Random隨機(jī)數(shù)的使用最為復(fù)雜。
2、Random類對象有是否帶種子之分,帶種子的只要種子相同,多次運(yùn)行,生成隨機(jī)數(shù)的結(jié)果總是那樣。
3、帶種子隨機(jī)數(shù)的帶種子的對象創(chuàng)建方式有兩種,效果一樣。但是帶種子的隨機(jī)數(shù)用處似乎不大。
4、Random的功能涵蓋了Math.random()的功能。
5、可以通過隨機(jī)數(shù)去做實(shí)現(xiàn)隨機(jī)字符串等復(fù)雜的隨機(jī)數(shù)據(jù)。
6、不要研究不重復(fù)的隨機(jī)數(shù),意義不大。
【編輯推薦】
- Java隨機(jī)數(shù)總結(jié)(***部分)
- 走進(jìn)Java 7中的模塊系統(tǒng)
- JavaFX 1.2 已經(jīng)發(fā)布 主要新功能一覽
- 2009年十大Java技術(shù)解決方案
- 2008最值得學(xué)習(xí)的五種JAVA技術(shù)