天天看點

JAVA中random頭檔案,Java中的random函數

最近寫一個小程式的時候,用到了java 的random函數。于是詳細地看了一下API文檔,也去網上搜了一下相關資料。在這裡對其做一個總結。

java一共存在兩種random函數。

一、java.lang.math.random

該方法傳回帶正号的 double 值,該值大于等于 0.0 且小于 1.0。傳回值是一個僞随機選擇的數,在該範圍内(近似)均勻分布。也就是左閉右開的區間。借助下面的代碼了解:

JAVA中random頭檔案,Java中的random函數
JAVA中random頭檔案,Java中的random函數

可以看出進行10次循環,0、1、2在此區間均勻分布。

需要注意的一點是Math.random傳回的是double類型的值,需要其它類型的随機數時需要進行類型轉化。

二、java.lang.util.random

對于API文檔中的描述,總結起來就是:

1、該方法是一個僞随機的随即算法,根據一定的規則生成随機數,基于給定的種子數,生成給定區間的僞随機數。

2、生成的随機數在區間内近似均勻分布,也就是每個數字出現的幾率相同。

3、随機數跟種子數有關,對于相同種子數的兩個随機變量,它們生成的随機序列是一樣。這一點在下文會有驗證。

這裡的random有兩個構造方法:

random()--建立一個新的随機數生成器。此構造方法将随機數生成器的種子設定為某個值,該值與此構造方法的所有其他調用所用的值完全不同。

random(long seed)--使用單個long 種子建立一個新的随機數生成器。該種子是僞随機數生成器的内部狀态的初始值,該生成器可通過方法next(int) 維護。 調用new Random(seed) 等效于:

Random rnd = new Random();

rnd.setSeed(seed);

無參構造器會以與預設的系統時間相關的數字作為種子,以保證“該值與此構造方法的所有其他調用所用的值完全不同”。

有參構造器會使用給定的合法的參數。

需要注意:使用給定的合法種子時,種子數隻是随機數的起源數字,跟生成随機數的範圍區間無關,區間是由nextInt(int m)中的參數m确定。

Random rand =new Random();

int i;

i=rand.nextInt(100);

參數30開始并沒有起作用(注意:并非不起作用),

nextInt(100)中的參數100規定了随機數的範圍為0-100,可以取0,取不到100。

至于給定種子數有什麼作用,下面以例子來解釋一下。

JAVA中random頭檔案,Java中的random函數

由圖可見,種子數一樣時,兩個随機數序列是一樣的。

然後改一下,如下所示:

JAVA中random頭檔案,Java中的random函數

序列不一樣了。

最後總結一下:

1.java.Math.Random()實際是在内部調用java.util.Random()的,它有一個緻命的弱點,它和系統時間有關,也就是說相隔時間很短的兩個random比如:

double a = Math.random();

double b = Math.random();

即有可能會得到兩個一模一樣的double。

2.java.util.Random()在調用的時候可以實作和java.Math.Random()一樣的功能,而且他具有很多的調用方法,相對來說比較靈活。是以從總體來看,使用java.util.Random()會相對來說比較靈活一些。

繼續閱讀