Java Random介紹


一、簡介

Random類位於java.util包下,此類的實例用於生成偽隨機數流。之所以稱之為偽隨機,是因為真正意義上的隨機數(或者稱為隨機事件)在某次產生過程中是按照實驗過程表現的分布概率隨機產生的,其結果是不可預測,不可見的。而計算機中的隨機函數是按照一定的算法模擬產生的,其結果是確定的,可見的。我們認為這樣產生的數據不是真正意義上的隨機數,因而稱之為偽隨機。
 

二、Random類的使用

2.1 生成Random對象

Java API中提供了兩個構造方法來new一個Random對象。無參構造底層調用的也是有參構造,將System.nanoTime()作為參數傳遞。即如果使用無參構造,默認的seed值為System.nanoTime()。
在JDK1.5版本以前,默認的種子用的是System.currentTimeMillis()。這里簡單說明下System.nanoTime()與System.currentTimeMillis()的區別。System.currentTimeMillis()產生一個當前的毫秒,這個毫秒是自1970年1月1日0時起到當前的毫秒數。而System.nanoTime()是從某個不確定的時間起(同一個的虛擬機上起始時間是固定的),到當前的時間差,它精確到納秒,這個不確定的起始時間可以是未來,如果起始時間是未來,得到的就是個負數。它的主要用途是衡量一個時間段,比如說一段代碼所執行的時間。
Random random = new Random()
Random random2 = new Random(long seed)
對於有參構造,需要注意的是,如果seed值相同,不管執行多少次,隨機生成的數據是相同的,具體看下例:
package dailytest;
 
import java.util.Random; import org.junit.Test; /** * Random類學習 * @author yrr * */ public class RandomTest { /** * 使用有參數構造生成Random對象 * 不管執行多少次,每次得到的結果都相同 * -1157793070 * 1913984760 * 1107254586 */ @Test public void test01(){ Random random = new Random(10); for (int i = 0; i < 3; i++) { System.out.println(random.nextInt()); } } } 

 

2.2 Random類中的方法

簡單方法如下所示
/**
     * 測試Random類中的簡單方法
     */
    @Test
    public void test02() { Random random = new Random(); System.out.println("nextInt():" + random.nextInt()); //隨機生成一個整數,這個整數的范圍就是int類型的范圍-2^31~2^31-1 System.out.println("nextLong():" + random.nextLong()); //隨機生成long類型范圍的整數 System.out.println("nextFloat():" + random.nextFloat()); //隨機生成[0, 1.0)區間的小數 System.out.println("nextDouble():" + random.nextDouble()); //隨機生成[0, 1.0)區間的小數 byte[] byteArr = new byte[10]; random.nextBytes(byteArr); //隨機生成byte,並存放在定義的數組中,生成的個數等於定義的數組的個數 for (int i = 0; i < byteArr.length; i++) { System.out.println(byteArr[i]); } /** * random.nextInt(n) * 隨機生成一個正整數,整數范圍[0,n) * 如果想生成其他范圍的數據,可以在此基礎上進行加減 * * 例如: * 1. 想生成范圍在[0,n]的整數 * random.nextInt(n+1) * 2. 想生成范圍在[m,n]的整數, n > m * random.nextInt(n-m+1) + m * random.nextInt() % (n-m) + m * 3. 想生成范圍在(m,n)的整數 * random.nextInt(n-m+1) + m -1 * random.nextInt() % (n-m) + m - 1 * ...... 主要是依靠簡單的加減法 */ System.out.println("nextInt(10):" + random.nextInt(10)); //隨機生成一個整數,整數范圍[0,10) for (int i = 0; i < 20; i++) { //[3,15) //這里有坑,需要注意,如果前面用了+號,應該要把計算結果整體用括號括起來,不然它會把+號解釋為字符串拼接 System.out.println("我生成了一個[3,15)區間的數,它是:" + (random.nextInt(12) + 3)); } }

 

JDK1.8新增方法:
package dailytest;
 
import java.util.Random; import org.junit.Test; /** * Random類學習 * @author yrr * */ public class RandomTest { /** * 測試Random類中 JDK1.8提供的新方法 * JDK1.8新增了Stream的概念 * 在Random中,為double, int, long類型分別增加了對應的生成隨機數的方法 * 鑒於每種數據類型方法原理是一樣的,所以,這里以int類型舉例說明用法 */ @Test public void test03() { Random random = new Random(); random.ints(); //生成無限個int類型范圍內的數據,因為是無限個,這里就不打印了,會卡死的...... random.ints(10, 100); //生成無限個[10,100)范圍內的數據 /** * 這里的toArray 是Stream里提供的方法 */ int[] arr = random.ints(10).toArray(); //生成10個int范圍類的個數。  System.out.println(arr.length); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } //生成5個在[10,100)范圍內的整數 random.ints(5, 10, 100).forEach(System.out :: println); //這句話和下面三句話功能相同 //forEach等價於: arr = random.ints(5, 10, 100).toArray(); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } /** * 對於 * random.ints(); * random.ints(ori, des); * 兩個生成無限個隨機數的方法,我們可以利用Stream里的terminal操作,來截斷無限這個操作 */ //limit表示限制只要10個,等價於random.ints(10) random.ints().limit(10).forEach(System.out :: println); //等價於random.ints(5, 10, 100) random.ints(10, 100).limit(5).forEach(System.out :: println); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM