天天看點

Java 随機數、機率實作——Random類 一、Random類兩個構造方法: 二、Random類中的常用5種方法:三、常見使用示例(重點):四、常見問題:

前言:Random類中實作的随機算法是僞随機,也就是有規則的随機。在進行随機時,随機算法的起源數字稱為種子數(seed),在種子數的基礎上進行一定的變換,進而産生需要的随機數字。相同種子數的Random對象,相同次數生成的随機數字是完全相同的。也就是說,兩個種子數相同的Random對象,第一次生成的随機數字完全相同,第二次生成的随機數字也完全相同,這點在生成多個随機數字時需要特别注意。下面分三部分來講解一下Random類的使用,以及如何生成指定區間的随機數組以及實作程式中要求的幾率。

一、Random類兩個構造方法:

1、public Random():該構造方法使用一個和目前系統時間對應的相對時間有關的數字作為種子數,然後使用這個種子數構造Random對象。

2、public Random(long seed):該構造方法可以通過制定一個種子數進行建立。

示例代碼:

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

再次強調:種子數隻是随機算法的起源數字,和生成的随機數字的區間無關。

二、Random類中的常用5種方法:

Random類中各方法生成的随機數字都是均勻分布的,也就是說區間内部的數字生成的幾率是均等的。

1、public boolean nextBoolean():

該方法的作用是生成一個随機的boolean值,生成true和false的值幾率相等,也就是都是50%的幾率。

2、public double nextDouble():

該方法的作用是生成一個随機的double值,數值介于[0,1.0)之間。

3、public int nextInt():

該方法的作用是生成一個随機的int值,該值介于int的區間,也就是-231到231-1之間。

如果需要生成指定區間的int值,則需要進行一定的數學變換,具體可以參看下面的使用示例中的代碼。

4、public int nextInt(int n):

該方法的作用是生成一個随機的int值,該值介于[0,n)的區間,也就是0到n之間的随機int值,

包含0而不包含n。如果想生成指定區間的int值,也需要進行一定的數學變換,具體可以參看下面的使用示例中的代碼。

5、public void setSeed(long seed):

該方法的作用是重新設定Random對象中的種子數。

設定完種子數以後的Random對象和相同種子數使用new關鍵字建立出的Random對象相同。

三、常見使用示例(重點):

首先,初始化一個對象:Random r = new Random(); 1、生成[0,1.0)區間的小數:

double d1 = r.nextDouble();
           

2、生成[0,5.0)區間的小數:将該區間擴大5倍即是要求的區間。

double d1 = r.nextDouble();
           

3、生成[1,2.5)區間的小數:隻需要首先生成[0,1.5)區間的随機數字,然後将生成的随機數區間加1即可。

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

4、生成任意整數:直接使用nextInt方法即可。

int n1 = r.nextInt();
           

5、生成[0,10)區間的整數:

int n2 = r.nextInt(10);
n2 = Math.abs(r.nextInt() % 10);
           

6、生成[-3,15)區間的整數:

int n4 = r.nextInt(18) - 3;
           

7、幾率實作:

在前面的方法介紹中,nextInt(int n)方法中生成的數字是均勻的,也就是說該區間内部的每個數字生成的幾率是相同的。 比如生成一個[0,100)區間的随機整數,則每個數字生成的幾率應該是相同的,而且由于該區間中總計有100個整數, 是以每個數字的幾率都是1%。按照這個理論,可以實作程式中的幾率問題。

題目:如何寫出随機生成一個整數,該整數以55%的幾率生成1,以40%的幾率生成2,以5%的幾率生成3,Java代碼?

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;
}
           

四、常見問題:

1、相同種子數Random對象問題: 測試代碼:

import java.io.*;
import java.util.Random;
class test  
{
	public static void main (String[] args) throws java.lang.Exception
	{
         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());
         }
	}
}
           

輸出結果:完全相同!

-1157793070
-1157793070
1913984760
1913984760
           

分析:在該代碼中,對象r1和r2使用的種子數都是10,則這兩個對象相同次數生成的随機數是完全相同的。

如果想避免出現随機數字相同的情況,則需要注意,無論項目中需要生成多少個随機數字,都隻使用一個Random對象即可。

2、關于Math類中的random方法:(代碼習慣)

其實在Math類中也有一個random方法,該random方法的工作是生成一個[0,1.0)區間的随機小數。

通過閱讀Math類的源代碼可以發現,Math類中的random方法就是直接調用Random類中的nextDouble方法實作的。

隻是random方法的調用比較簡單,是以很多程式員都習慣使用Math類的random方法來生成随機數字。

覺得有用,請點個贊。