Java中存在着兩種Random函數:
一、java.lang.Math.Random:
調用這個Math.Random()函數能夠返回帶正號的double值,該值大於等於0.0且小於1.0,即取值范圍是[0.0,1.0)的左閉右開區間,返回值是一個偽隨機數,在該范圍內(近似)均勻分布。

1 Math.Random()函數產生的隨機數:0.9956775355643588
2 Math.Random()函數產生的隨機數:0.3452454357686029
3 Math.Random()函數產生的隨機數:0.9489235373049734
4 Math.Random()函數產生的隨機數:0.5280729775003039
二、java.util.Random:
Random類是偽隨機數的產生器。之所以稱之為偽隨機數是因為它們是簡單的均勻分布序列。Random定義了下面的構造函數。
- Random()
- Random(long seed)
第一種形式創建一個使用當前時間作為起始值或稱為初始值的數字發生器。第二種形式允許人為指定一個初值。
如果用初值初始化了一個Random對象,就對隨機序列定義了起始點。如果用相同的初值初始化另一個Random對象,將獲得同一隨機序列。如果要生成不同的序列,應當指定不同的初值。實現這種處理的最簡單的方法是使用當前時間作為產生Random對象的初值。這種方法減少了得到相同序列的可能性。
方法 | 描述 |
boolean nextBoolean | 返回下一個布爾(boolean)隨機數 |
void nextBytes(byte vals[]) | 用隨機產生的值填充vals |
double nextDouble() | 返回下一個雙精度(double)隨機數 |
float nextFloat() | 返回下一個浮點(float)隨機數 |
double nextGaussian() | 返回下一個高斯隨機數 |
int nextInt() | 返回下一個整型(int)隨機數 |
int nextInt(int n) | 返回下一個介於0和n之間的整型(int)隨機數 |
long nextLong() | 返回下一個長整型(long)隨機數 |
void setSeed(long newSeed) | 將由newSeed指定的值作為種子值(也就是隨機數產生器的開始值) |
正如你能看到的,從Random對象中可以提取七種類型的隨機數。從nextBoolean()方法中可以獲得隨機布爾數。通過調用nextBytes()方法獲得隨機字節數。通過調用nextInt()方法可以獲得隨機整型數。通過調用nextLong()方法可以獲得均勻分布的長整型隨機數。通過調用nextFloat()和nextDouble()方法可以分別得到在0.0到1.0之間的,均勻分布的float和double隨機數。最后,調用nextGaussian()方法返回中心在0.0,標准偏差為1.0的double值,這就是著名的鍾形曲線。
三、Random類使用示例
Random r = new Random()
- 生成[0, 1.0)區間的小數:double d1 = r.nextDouble();直接使用nextDouble方法獲得。
- 生成[0, 5.0)區間的小數:double d2 r.nextDouble()*5;因為nextDouble方法生成的數字區間是[0, 1.0),將該區間擴大5倍即是要求的區間。同理,生成[0, d)區間的隨機小數,d為任意正的小數,則只需要將nextDouble方法的返回值乘以d即可。
- 生成[1, 2.5)區間的小數:double d3 = r.nextDouble()*1.5+1;生成[1, 2.5)區間的隨機小數,則只需要首先生成[0, 1.5)區間的隨機數字,然后將生成的隨機數區間加1即可。同理,生成任意非從0開始的小數區間[d1, d2)范圍的隨機數字(其中d1不等於0),則只需要首先生成[0, d2-d1)區間的隨機數字,然后將生成的隨機數區間加上d1即可。
- 生成任意整數:int n1 = r.nextInt();直接使用nextInt方法即可。
- 生成[0, 10)區間的整數:int n2 = r.nextInt(10) /n2 = Math.abs(r.nextInt()%10) ;前面兩種方法均可生成[0, 10)區間的整數。第一種實現使用Random類中的nextInt(int n)方法直接實現。第二種實現中,首先調用nextInt()方法生成一個任意的int數字,該數字和10取余以后生成的數組區間為(-10, 10),然后再對該區間求絕對值,則得到的區間就是[0, 10)了。同理,生成任意[0, n)區間的隨機整數,都可以使用如下代碼:int n2 = r.nextInt(n); n2 = Math.abs(r.nextInt()%n)
- 生成[0, 10]區間的整數:int n3 = r.nextInt(11);n3 = Math.abs(r.nextInt()%11)相對於整數區間,[0, 10]區間和[0, 11)區間等價,所以即生成[0, 11)區間的整數。
- 生成[-3, 15)區間的整數:int n4 = r.nextInt(18)-3; n4 = Math.abs(r.next()%18)-3;生成非從0開始區間的隨機整數,可以參看上面非從0開始的小數區間實現原理的說明。