天天看點

java産生随機數的幾種方式

随機數在實際中使用很廣泛,比如要随即生成一個固定長度的字元串、數字。或者随即生成一個不定長度的數字、或者進行一個模拟的随機選擇等等。java提供了最基本的工具,可以幫助開發者來實作這一切。

    一、java随機數的産生方式

    在java中,随機數的概念從廣義上将,有三種。

    1、通過system.currenttimemillis()來擷取一個目前時間毫秒數的long型數字。

    2、通過math.random()傳回一個0到1之間的double值。

    3、通過random類來産生一個随機數,這個是專業的random工具類,功能強大。

    二、random類api說明

    1、java api說明

    random類的執行個體用于生成僞随機數流。此類使用 48 位的種子,使用線性同餘公式對其進行修改(請參閱 donald knuth 的《the art of computer programming, volume 2》,第 3.2.1 節)。

    如果用相同的種子建立兩個 random 執行個體,則對每個執行個體進行相同的方法調用序列,它們将生成并傳回相同的數字序列。為了保證屬性的實作,為類 random 指定了特定的算法。

    很多應用程式會發現 math 類中的 random 方法更易于使用。

    2、方法摘要

random()

          建立一個新的随機數生成器。

random(long seed)

          使用單個 long 種子建立一個新随機數生成器: public random(long seed) { setseed(seed); } next 方法使用它來儲存随機數生成器的狀态。

protected  int next(int bits)

          生成下一個僞随機數。

 boolean nextboolean()

          傳回下一個僞随機數,它是從此随機數生成器的序列中取出的、均勻分布的 boolean 值。

 void nextbytes(byte[] bytes)

          生成随機位元組并将其置于使用者提供的位元組數組中。

 double nextdouble()

          傳回下一個僞随機數,它是從此随機數生成器的序列中取出的、在 0.0 和 1.0之間均勻分布的 double 值。

 float nextfloat()

          傳回下一個僞随機數,它是從此随機數生成器的序列中取出的、在 0.0 和 1.0 之間均勻分布的 float 值。

 double nextgaussian()

          傳回下一個僞随機數,它是從此随機數生成器的序列中取出的、呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标準偏差是 1.0。

 int nextint()

          傳回下一個僞随機數,它是此随機數生成器的序列中均勻分布的 int 值。

 int nextint(int n)

          傳回一個僞随機數,它是從此随機數生成器的序列中取出的、在 0(包括)和指定值(不包括)之間均勻分布的 int值。

 long nextlong()

          傳回下一個僞随機數,它是從此随機數生成器的序列中取出的、均勻分布的 long 值。

 void setseed(long seed)

          使用單個 long 種子設定此随機數生成器的種子。

三、random類使用說明

    1、帶種子與不帶種子的差別random類使用的根本是政策分帶種子和不帶種子的random的執行個體。

    通俗說,兩者的差別是:帶種子的,每次運作生成的結果都是一樣的。

    不帶種子的,每次運作生成的都是随機的,沒有規律可言。

    2、建立不帶種子的random對象

    random random = new random();

    3、建立不帶種子的random對象有兩種方法:

    1) random random = new random(555l);

    2) random random = new random();random.setseed(555l);

    四、測試

    通過一個例子說明上面的用法

import java.util.random;

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);

        public static void testseed2() {

                system.out.println("--------------testseed2()--------------");

                random.setseed(555l);

}

    運作結果:

--------------test()--------------

r1 = 1227108626582

r3 = 0.5324887850155043

r2 = -368083737

--------------testnoseed()--------------

809503475

1585541532

-645134204

--------------testseed1()--------------

-1367481220

292886146

-1462441651

--------------testseed2()--------------

process finished with exit code 0

    通過testseed1()與testseed2()方法的結果可以看到,兩個列印結果相同,因為他們種子相同,再運作一次,結果還是一樣的,這就是帶種子随機數的特性。

    而不帶種子的,每次運作結果都是随機的。

五、綜合應用

    下面通過最近寫的一個随機數工具類來展示用法:

/**

* 随機數、随即字元串工具 

*/

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();

                for (int i = 0; i < length; i++) {

                        sb.append(allchar.charat(random.nextint(allchar.length())));

                return sb.tostring();

         * 傳回一個定長的随機純字母字元串(隻包含大小寫字母)

        public static string generatemixstring(int length) {

                        sb.append(allchar.charat(random.nextint(letterchar.length())));

         * 傳回一個定長的随機純大寫字母字元串(隻包含大小寫字母)

        public static string generatelowerstring(int length) {

                return generatemixstring(length).tolowercase();

         * 傳回一個定長的随機純小寫字母字元串(隻包含大小寫字母)

        public static string generateupperstring(int length) {

                return generatemixstring(length).touppercase();

         * 生成一個定長的純0字元串

         * @param length 字元串長度

         * @return 純0字元串

        public static string generatezerostring(int length) {

                        sb.append('0');

         * 根據數字生成一個定長的字元串,長度不夠前面補0

         * @param num             數字

         * @param fixdlenth 字元串長度

         * @return 定長的字元串

        public static string tofixdlengthstring(long num, int fixdlenth) {

                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);

        public static string tofixdlengthstring(int num, int fixdlenth) {

                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