Random類專門用於生成一個偽隨機數,它有兩個構造器:一個構造器使用預設的種子(以當前時間作為種子),另一個構造器需要程式員顯示傳入一個long型整數的種子。 Random類比Math類的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);