Java的Random類詳解


Random類專門用於生成一個偽隨機數,它有兩個構造器:一個構造器使用默認的種子(以當前時間作為種子),另一個構造器需要程序員顯示傳入一個long型整數的種子。

Random類比Math類的random()方法提供了更多的方式來生成各種偽隨機數,可以生成浮點類型的偽隨機數,也可以生成整數類型的偽隨機數,還可以指定生成隨機數的范圍。Random類的常用用法如下示例:

public class Test {
    public static void main(String[] args) {
        Random rand = new Random();
        System.out.println("rand.nextBoolean():" + rand.nextBoolean());
        // 生成0.0-1.0之間的偽隨機double數
        System.out.println("rand.nextDouble():" + rand.nextDouble());
        // 生成0.0-1.0之間的偽隨機float數
        System.out.println("rand.nextFloat():" + rand.nextFloat());
        // 生成一個處於int整數取值范圍的偽隨機數
        System.out.println("rand.nextInt():" + rand.nextInt());
        // 生成0-20之間的偽隨機整數
        System.out.println("rand.nextInt(20):" + rand.nextInt(20));
        // 生成一個處於long整數取值范圍的偽隨機數
        System.out.println("rand.nextLong():" + rand.nextLong());
    }
}

運行結果:

rand.nextBoolean():false
rand.nextDouble():0.642852533214433
rand.nextFloat():0.2703439
rand.nextInt():1773302756
rand.nextInt(20):3
rand.nextLong():1175156863283867437

從上面程序可以看出,Random可以提供很多選項來生成偽隨機數。

Random使用一個48位的種子,如果這個類的兩個實例是用同一個種子創建的,對它們的方法以同樣的順序調方法,則它們會產生相同的數字序列。也就是說,Random產生的數字並不是真正的隨機,而是一種偽隨機。

為了避免兩個Random對象產生相同的數字序列,通常推薦使用當前時間作為Random對象的種子,如下代碼所示:

Random rand = new Random(System.currentTimeMillis());

在並發訪問的環境下,使用ThreadLocalRandom來代替Random可以減少多線程資源競爭,最終保證系統具有更好的線程安全性。ThreadLocalRandom的用法與Random基本相似,它提供了一個靜態的current()方法來獲取ThreadLocalRandom對象,獲取該對象之后即可調用各種nextXxx()方法來獲取偽隨機數。下面代碼示范了ThreadLocalRandom的用法:

ThreadLocalRandom rand = ThreadLocalRandom.current();
//生成一個5-20之間的隨機數
int r1 = rand.nextInt(5,20);        
//生成一個5.0-20.0之間的隨機浮點數
double r2 = rand.nextDouble(5.0, 20.0);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM