天天看點

關于Random

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進行生成:

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開始的小數區間實作原理的說明。

繼續閱讀