程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JAVA的Random類的用法詳解

JAVA的Random類的用法詳解

編輯:關於JAVA

JAVA的Random類的用法詳解。本站提示廣大學習愛好者:(JAVA的Random類的用法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是JAVA的Random類的用法詳解正文


Random類 (java.util)        

Random類中完成的隨機算法是偽隨機,也就是有規矩的隨機。在停止隨機時,隨機算法的來源數字稱為種子數(seed),在種子數的基本長進行必定的變換,從而發生須要的隨機數字。

雷同種子數的Random對象,雷同次數生成的隨機數字是完整雷同的。也就是說,兩個種子數雷同的Random對象,第一次生成的隨機數字完整雷同,第二次生成的隨機數字也完整雷同。這點在生成多個隨機數字時須要特殊留意。

上面引見一下Random類的應用,和若何生成指定區間的隨機數組和完成法式中請求的概率。

1、Random對象的生成

Random類包括兩個結構辦法,上面順次停止引見:

a、public Random()

該結構辦法應用一個和以後體系時光對應的絕對時光有關的數字作為種子數,然後應用這個種子數結構Random對象。

b、public Random(long seed)

該結構辦法可以經由過程制訂一個種子數停止創立。

示例代碼:


Random r = new Random();
Random r1 = new Random(10);

再次強調:種子數只是隨機算法的來源數字,和生成的隨機數字的區間有關。

2、Random類中的經常使用辦法

Random類中的辦法比擬簡略,每一個辦法的功效也很輕易懂得。須要解釋的是,Random類中各辦法生成的隨機數字都是平均散布的,也就是說區間外部的數字生成的概率是均等的。上面對這些辦法做一下根本的引見:

a、public boolean nextBoolean()

該辦法的感化是生成一個隨機的boolean值,生成true和false的值概率相等,也就是都是50%的概率。

b、public double nextDouble()

該辦法的感化是生成一個隨機的double值,數值介於[0,1.0)之間。

c、public int nextInt()

該辦法的感化是生成一個隨機的int值,該值介於int的區間,也就是-231到231-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)區間的小數


double d3 = r.nextDouble() * 1.5 + 1;

生成[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;
n4 = Math.abs(r.nextInt() % 18) - 3;

生成非從0開端區間的隨機整數,可以參看下面非從0開端的小數區間完成道理的解釋。

h、概率完成

依照必定的概率完成法式邏輯也是隨機處置可以處理的一個成績。上面以一個簡略的示例演示若何應用隨機數字完成概率的邏輯。

在後面的辦法引見中,nextInt(int n)辦法中生成的數字是平均的,也就是說該區間外部的每一個數字生成的概率是雷同的。那末假如生成一個[0,100)區間的隨機整數,則每一個數字生成的概率應當是雷同的,並且因為該區間中總計有100個整數,所以每一個數字的概率都是1%。依照這個實際,可以完成法式中的概率成績。

示例:隨機生成一個整數,該整數以55%的概率生成1,以40%的概率生成2,以5%的概率生成3。完成的代碼以下:


int n5 = r.nextInt(100);
int m; //成果數字
if(n5 < 55){ //55個數字的區間,55%的概率
    m = 1;
}else if(n5 < 95){//[55,95),40個數字的區間,40%的概率
    m = 2;
}else{
    m = 3;
}

由於每一個數字的概率都是1%,則隨意率性55個數字的區間的概率就是55%,為了代碼便利書寫,這裡應用[0,55)區間的一切整數,後續的道理一樣。

固然,這裡的代碼可以簡化,由於概率都是5%的倍數,所以只需以5%為基本來掌握概率便可,上面是簡化的代碼完成:


int n6 = r.nextInt(20);
int m1;
if(n6 < 11){
    m1 = 1;
}else if(n6 < 19){
    m1 = 2;
}else{
    m1 = 3;
}

在法式外部,概率的邏輯便可以依照下面的解釋停止完成。

4、其它成績

a、雷同種子數Random對象成績

後面引見過,雷同種子數的Random對象,雷同次數生成的隨機數字是完整雷同的,上面是測試的代碼:


Random r1 = new Random(10);
Random r2 = new Random(10);
for(int i = 0;i < 2;i++){
     System.out.println(r1.nextInt());
     System.out.println(r2.nextInt());
}

在該代碼中,對象r1和r2應用的種子數都是10,則這兩個對象雷同次數生成的隨機數是完整雷同的。

假如想防止湧現隨機數字雷同的情形,則須要留意,不管項目中須要生成若干個隨機數字,都只應用一個Random對象便可。

b、關於Math類中的random辦法

其其實Math類中也有一個random辦法,該random辦法的任務是生成一個[0,1.0)區間的隨機小數。

經由過程浏覽Math類的源代碼可以發明,Math類中的random辦法就是直接挪用Random類中的nextDouble辦法完成的。

只是random辦法的挪用比擬簡略,所以許多法式員都習氣應用Math類的random辦法來生成隨機數字。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved