java中通常有兩種隨機數,一個是Math中random()方法,一個是Random類。java
1、Math.random()算法
隨即生成0<x<1的小數。dom
實例:如何寫,生成隨機生成出0~100中的其中一個數呢?spa
20-80之間隨機數:(int)((80-20)*Math.random())+(20-0)即:。(最大-最小)*Math.random()+最小-0對象
Math.random()返回的只是從0到1之間的小數,若是要50到100,就先放大50倍,即0到50之間,這裏仍是小數,若是要整數,就強制轉換int,而後再加上50即爲50~100.
最終代碼:(int)(Math.random()*50) + 50數學
2、Random類基礎
Random random = new Random();//默認構造方法原理
Random random = new Random(1000);//指定種子數字隨機數
在進行隨機時,隨機算法的起源數字稱爲種子數(seed),在種子數的基礎上進行必定的變換,從而產生須要的隨機數字。方法
相同種子數的Random對象,相同次數生成的隨機數字是徹底相同的。也就是說,兩個種子數相同的Random對象,第一次生成的隨機數字徹底相同,第二次生成的隨機數字也徹底相同。
2 、Random類中的經常使用方法
Random 類中的方法比較簡單,每一個方法的功能也很容易理解。須要說明的是,Random類中各方法生成的隨機數字都是均勻分佈的,也就是說區間內部的數字生成的概率是均等的。下面對這些方法作一下基本的介紹:
a 、public boolean nextBoolean()
該方法的做用是生成一個隨機的boolean值,生成true和false的值概率相等,也就是都是50%的概率。
b 、public double nextDouble()
該方法的做用是生成一個隨機的double值,數值介於[0,1.0)之間,這裏中括號表明包含區間端點,小括號表明不包含區間端點,也就是0到1之間的隨機小數,包含0而不包含1.0。
c 、public int nextInt()
該方法的做用是生成一個隨機的int值,該值介於int的區間,也就是-2的31次方到2的31次方-1之間。
若是須要生成指定區間的int值,則須要進行必定的數學變換,具體能夠參看下面的使用示例中的代碼。
d 、public int nextInt(int n)
該方法的做用是生成一個隨機的int值,該值介於[0,n)的區間,也就是0到n之間的隨機int值,包含0而不包含n。
若是想生成指定區間的int值,也須要進行必定的數學變換,具體能夠參看下面的使用示例中的代碼。
e 、public void setSeed(long seed)
該方法的做用是從新設置Random對象中的種子數。設置完種子數之後的Random對象和相同種子數使用new關鍵字建立出的Random對象相同。
3 、Random類使用示例
使用Random類,通常是生成指定區間的隨機數字,下面就一一介紹如何生成對應區間的隨機數字。如下生成隨機數的代碼均使用如下Random對象r進行生成:
Random r = new Random();
a 、生成[0,1.0)區間的小數
double d1 = r.nextDouble();
直接使用nextDouble方法得到。
b、生成[0,5.0)區間的小數
double d2 = r.nextDouble() * 5;
由於nextDouble方法生成的數字區間是[0,1.0),將該區間擴大5倍便是要求的區間。
同理,生成[0,d)區間的隨機小數,d爲任意正的小數,則只須要將nextDouble方法的返回值乘以d便可。
c、生成[1,2.5)區間的小數 [n1,n2]
double d3 = r.nextDouble() * 1.5 + 1;【也就是 r.nextDouble() * (n2-n1)+n1】
生成[1,2.5)區間的隨機小數,則只須要首先生成[0,1.5)區間的隨機數字,而後將生成的隨機數區間加1便可。
同理,生成任意非從0開始的小數區間[d1,d2)範圍的隨機數字(其中d1不等於0),則只須要首先生成[0,d2-d1)區間的隨機數字,而後將生成的隨機數字區間加上d1便可。
d、生成任意整數
int n1 = r.nextInt();
直接使用nextInt方法便可。
e、生成[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);
f、生成[0,10]區間的整數
int n3 = r.nextInt(11);
n3 = Math.abs(r.nextInt() % 11);
相對於整數區間,[0,10]區間和[0,11)區間等價,因此即生成[0,11)區間的整數。
g、生成[-3,15)區間的整數
int n4 = r.nextInt(18) - 3; 【也就是 r.nextInt() * (n2-n1)+n1】 n1是個負數
n4 = Math.abs(r.nextInt() % 18) - 3;
生成非從0開始區間的隨機整數,能夠參看上面非從0開始的小數區間實現原理的說明。