Java中存在着兩種Random函數:
一、java.lang.Math.Random
Math.random()方法生成大於等於0.0且小於1.0的double型隨機數(0.0<=Math.random<1.0),返回值是一個僞隨機選擇的數,在該範圍內(近似)均勻分佈。舉一個小例子:
public class Demo {
public static void main(String[] args) {
for (int i = 0; i < 6; i++) {
int r = (int) (Math.random() * 100);
System.out.println("number is " + r);
}
}
}
注意:Math.Random()函數返回的是double類型的值,所以在要賦值給其他類型的變量的時候注意需要進行類型轉換。
此方法是完全同步的,可允許多個線程使用而不出現錯誤。但是,如果許多線程需要以極高的速率生成僞隨機數,那麼這可能會減少每個線程對擁有自己僞隨機數生成器的爭用。
二、java.util.Random
- java.util.Random類中實現的隨機算法也是僞隨機的,Random類中各方法生成的隨機數字都是均勻分佈的,也就是說區間內部的數字生成的機率均等;
- 相同種子數的Random對象,相同次數生成的隨機數字是完全相同的。
Random()的兩種構造方法:
- Random():以當前時間作爲種子創建一個Random對象,並且採用線性同餘法計算下一個隨機數。
- Random(long seed):使用特定值作爲種子創建一個Random對象。
提示:種子是一個用於初始化一個隨機數字生成器的數字,如果兩個Random對象有相同的種子,那它們會產生相同的數列。
方法 | 說明 |
---|---|
nextInt( ) : int | 返回一個隨機的int值 |
nextInt(n : int): int | 返回一個0到n(不包含n)之間的隨機int類型的值 |
nextLong( ) : long | 返回一個隨機的long值 |
nextFloat( ) : float | 返回一個0.0到1.0(不包含1.0F)之間的隨機float類型的值 |
nextDouble( ) : double | 返回一個0.0到1.0(不包含1.0)之間的隨機double類型的值 |
nextBoolean( ) : boolean | 返回一個隨機的boolean值 |
舉一個小例子:
import java.util.Random;
public class Demo {
public static void main(String[] args) {
Random random1 = new Random(100);
System.out.print("random1: ");
for (int i = 0; i < 10; i++) {
System.out.print(random1.nextInt(1000) + " ");
}
System.out.println();
Random random2 = new Random(100);
System.out.print("random2: ");
for (int i = 0; i < 10; i++) {
System.out.print(random2.nextInt(1000) + " ");
}
}
}
它產生相同的int類型的隨機數列:
最後簡單對比一下這兩個隨機函數的特點:
1. java.Math.Random()實際是在內部調用java.util.Random()的;
2. java.util.Random()在調用的時候可以實現和java.Math.Random()一樣的功能,而且它有更多的調用方法,相對來說比較靈活;
3. 二者都是弱隨機數,弱僞隨機數PRNG實現 java.util.Random類,默認使用當前時間作爲種子,並且採用線性同餘法計算下一個隨機數;強僞隨機數RNG實現java.security.SecureRandom類,該類使用臨時文件夾中大小,線程休眠時間等的值作爲隨機數種子。