Java 7的ThreadLocalRandom類與Random類

參考資料

[1]. 瘋狂Java講義(第三版) 李剛

概述

Random類專門用於生成一個僞隨機數,它有兩個構造器:一個構造器使用默認的種子(以當前時間作爲種子),另一個構造器需要程序員顯示傳入一個long型整數的種子。
ThreadLocalRandom類是Java 7新增的一個類,它是Random的增強版。在併發訪問環境下,使用ThreadLocalRandom來代替Random可以減少多線程資源競爭,最終保證系統具有更好的線程安全性。

基本使用

Random rand = new Random();
System.out.println("rand.nextBoolean():" + rand.nextBoolean());
byte[] buffer = new byte[16];
rand.nextBytes(buffer);
System.out.println(Arrays.toString(buffer));
// 生成0.0~1.0之間的僞隨機double數
System.out.println("rand.nextDouble():" + rand.nextDouble());
// 生成0.0~1.0之間的僞隨機float數
System.out.println("rand.nextFloat():" + rand.nextFloat());
// 生成平均值是 0.0,標準差是 1.0的僞高斯數
System.out.println("rand.nextGaussian():" + rand.nextGaussian());
// 生成一個處於int整數取值範圍的僞隨機整數
System.out.println("rand.nextInt():" + rand.nextInt());
// 生成0~26之間的僞隨機整數
System.out.println("rand.nextInt(26):" + rand.nextInt(26));
// 生成一個處於long整數取值範圍的僞隨機整數
System.out.println("rand.nextLong():" +  rand.nextLong());

僞隨機性

當兩個Random對象種子相同時,它們會產生相同的數字序列。當使用默認的種子構造Random對象時,它們屬於同一個種子。

Random r1 = new Random(50);
System.out.println("第一個種子爲50的Random對象");
System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());
System.out.println("r1.nextInt():\t\t" + r1.nextInt());
System.out.println("r1.nextDouble():\t" + r1.nextDouble());
System.out.println("r1.nextGaussian():\t" + r1.nextGaussian());
System.out.println("---------------------------");
Random r2 = new Random(50);
System.out.println("第二個種子爲50的Random對象");
System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());
System.out.println("r2.nextInt():\t\t" + r2.nextInt());
System.out.println("r2.nextDouble():\t" + r2.nextDouble());
System.out.println("r2.nextGaussian():\t" + r2.nextGaussian());
System.out.println("---------------------------");
Random r3 = new Random(100);
System.out.println("種子爲100的Random對象");
System.out.println("r3.nextBoolean():\t" + r3.nextBoolean());
System.out.println("r3.nextInt():\t\t" + r3.nextInt());
System.out.println("r3.nextDouble():\t" + r3.nextDouble());
System.out.println("r3.nextGaussian():\t" + r3.nextGaussian());

從輸出結果看,只要兩個Random對象的種子相同,而且方法的調用順序也相同,它們就會產生相同的數字序列,結果如下:

第一個種子爲50的Random對象
r1.nextBoolean():   true
r1.nextInt():       -1727040520
r1.nextDouble():    0.6141579720626675
r1.nextGaussian():  2.377650302287946
---------------------------
第二個種子爲50的Random對象
r2.nextBoolean():   true
r2.nextInt():       -1727040520
r2.nextDouble():    0.6141579720626675
r2.nextGaussian():  2.377650302287946
---------------------------
種子爲100的Random對象
r3.nextBoolean():   true
r3.nextInt():       -1139614796
r3.nextDouble():    0.19497605734770518
r3.nextGaussian():  0.6762208162903859

ThreadLocalRandom類

ThreadLocalRandom rand = ThreadLocalRandom.current();
// 生成一個4~20之間的僞隨機數
int val1 = rand.nextInt(4,20);
// 生成一個2.0~10.0之間的僞隨機數
double val2 = rand.nextDouble(2.0, 10.0 );
發佈了91 篇原創文章 · 獲贊 23 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章