最近寫一個小程式的時候,用到了java 的random函數。于是詳細地看了一下API文檔,也去網上搜了一下相關資料。在這裡對其做一個總結。
java一共存在兩種random函數。
一、java.lang.math.random
該方法傳回帶正号的 double 值,該值大于等于 0.0 且小于 1.0。傳回值是一個僞随機選擇的數,在該範圍内(近似)均勻分布。也就是左閉右開的區間。借助下面的代碼了解:
可以看出進行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。
至于給定種子數有什麼作用,下面以例子來解釋一下。
由圖可見,種子數一樣時,兩個随機數序列是一樣的。
然後改一下,如下所示:
序列不一樣了。
最後總結一下:
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()會相對來說比較靈活一些。