Java Random介紹

1、簡介

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

2、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); } }
相關文章
相關標籤/搜索