Math類和Random類生成的隨機數(shù)
一、Math類的random()方法
Math類的random()方法可以生成大于等于0.0、小于1.0的double型隨機數(shù)。
Math.random()方法語句基礎(chǔ)上處理可獲得多種類型、或任意范圍的隨機數(shù)。
公式:
int num=(int)(Math.random()*n); //返回大于等于0小于n之間的隨機數(shù)
int num0=m+(int)(Matn.randon()*n); //返回大于等于m小于m+n(不包括m+n)之間的隨機數(shù)
例如:我們需要取2~22之間的偶數(shù)
public class MathRandomDemo{
public static int GetevenNum(double num1,double num2){
int s=(int)num1+(int)(Math.random()*(num2-num1));
if(s%2==0){
return s;
}
else
retuen s+!;
}
public static void main(String[] args){
System.out.println("任意一個"+num1+"~"+num2+"之間的偶數(shù):"+GeteneNum(2,22));
}
}
還可以隨機生成字符
例如:
1.隨機生成a~z之間的字符
(char)('a'+Math.random()*('z'-'a'+1));
2.隨機生成cha1~cha2的字符
(char)(cha1+Math.random()*(cha2-cha1+1));
二、Random類生成隨機數(shù)
除了Math類的Random()方法可以獲取隨機數(shù)之外,還可以Java.util.Random類,可以通過實例化一個Random對象創(chuàng)建一個隨機數(shù)生成器。
1.語法:
Random ran=new Random();
ran:Random類的實例對象
以這種形式實例化對象時,Java編譯器以系統(tǒng)當(dāng)前時間作為隨機數(shù)生成器的種子,因為每時每刻的時間都不可能相同,所以產(chǎn)生的隨機數(shù)也不同。如果運行速度太快,也會產(chǎn)生兩次運行結(jié)果相同的隨機數(shù)。
2.可以在實例化Random類對象時,自定義隨機數(shù)生成器的種子。
語法:
Random ran=new Random(seedValue);
ran:Random類的實例對象
seedValue:隨機類生成器的種子。
Random類中還提供各種類型隨機數(shù)的方法:
nextInt():返回一個隨機整數(shù)(int)
nextInt(int n):返回大于等于0、小于n的隨機整數(shù)(int)
nextLong():返回一個隨機長整型值(long)
nextBoolean():返回一個隨機布爾型值(boolean)
nextFloat():返回一個隨機浮點型值(float)
nextDouble():返回一個隨機雙精度型值(double)
nextGaussian():概率密度為高斯分布的雙精度值(double)
例:
import java.util.Random;
public class Demo{
public static void main(String[] args){
Random ran=new Random();
System.out.println("產(chǎn)生一個隨機整數(shù):"+ran.nextlnt());
}
}
如果要獲得區(qū)間 [1~100]的隨機數(shù),該怎么辦呢?稍微動動腦筋就可以想到:區(qū)間 [0, 100) 內(nèi)的整數(shù),實際上就是區(qū)間 [0, 99]。因為最大邊界為100,可惜不能等于100,因此最大可能產(chǎn)生的“整數(shù)”就是99。
既然rand.nextInt(100) 獲得的值是區(qū)間 [0, 99],那么在這個區(qū)間左右各加 1,就得到了區(qū)間 [1, 100]。因此,代碼寫成:
rand.nextInt(100)+ 1;
即可。運行下面的代碼,將獲得 [1, 100] 的 10 個取值。
import java.util.Random;
public class Test {
public static void main(String[] args){
Random rand = new Random();
for(int i=0; i<10; i++) {
System.out.println(rand.nextInt(100) + 1);
}
}
}
同理,很容易知道如果要獲得隨機兩位整數(shù),代碼寫成:rand.nextInt(90) + 10;
你一定很驚訝,為什么是這么寫出來的。其實,在 nextInt() 方法中作為參數(shù)的數(shù)字 90 表示:你希望生成的隨機數(shù)的所有取值的可能性的數(shù)量(在本命題中,兩位整數(shù)取值為 [10, 99],共90個數(shù));加好后面的數(shù)字 10 ,表示區(qū)間的最小取值。
你可以驗證下,按照這樣理解,[1, 100] 的隨機數(shù),是不是應(yīng)該寫成rand.nextInt(100) + 1 。千萬不要把參數(shù) 100 理解為最大取值。只是區(qū)間 [1, 100] 正好從 1 開始,所以最大取值和取值可能性數(shù)量正好同為 100。
因此,
生成隨機三位數(shù)的代碼為:
rand.nextInt(900)+ 100;
生成區(qū)間 [64,128] 中隨機值的代碼為:
rand.nextInt(65)+ 64;
取值可能性的數(shù)量是如何計算出來的呢?當(dāng)然是 最大取值-最小取值+1 ,所以,有最終公式如下:
// For Java
int randNumber =rand.nextInt(MAX - MIN + 1) + MIN; // randNumber 將被賦值為一個 MIN 和 MAX 范圍內(nèi)的隨機數(shù)
舉例:
Random r =new Random(100);
System.out.println(r.nextInt(20));
種子數(shù)只是隨機算法的起源數(shù)字,和生成的隨機數(shù)字的區(qū)間沒有任何關(guān)系。
初始化時100并沒有起直接作用(注意:不是沒有起作用),r.nextInt(20)中的20是隨機數(shù)的上限,產(chǎn)生的隨機數(shù)為0-20的整數(shù),不包括20。
舉例:
Random r1 = new Random();
Random r2 = new Random();
//無參構(gòu)造使用的是參數(shù)作為種子數(shù)
Random r3 = new Random(100);
Random r4 = new Random(100);
//產(chǎn)生隨機數(shù)調(diào)用nextXXX()方法
System.out.println(r1.nextInt(10));
System.out.println(r1.nextInt(10));
System.out.println(r2.nextInt(10));
System.out.println(r2.nextInt(10));
System.out.println("-----------------");
System.out.println(r3.nextInt(10));
System.out.println(r3.nextInt(10));
System.out.println(r4.nextInt(10));
System.out.println(r4.nextInt(10));
結(jié)果:
5
1
4
0
-----------------
5
0
5
0
總結(jié):
1.同一個種子,生成N個隨機數(shù),當(dāng)你設(shè)定種子的時候,這N個隨機數(shù)是什么已經(jīng)確定。相同次數(shù)生成的隨機數(shù)字是完全相同的。
2.如果用相同的種子創(chuàng)建兩個 Random 實例,如上面的r3,r4,則對每個實例進行相同的方法調(diào)用序列,它們將生成并返回相同的數(shù)字序列。
3.Java的隨機數(shù)都是通過算法實現(xiàn)的,Math.random()本質(zhì)上屬于Random()類。
4.使用java.util.Random()會相對來說比較靈活一些。
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答!! 點擊進入論壇