java隨機數的生成
Java產生隨機數的三種方式
在Java中,隨機數的概念從廣義上講,有三種。
1、通過System.currentTimeMillis()來獲取一個當前時間毫秒數的long型數字。
2、通過Math.random()方法返回一個0到1之間的double值。
3、通過Random類來產生一個隨機數,這個是專業的Random工具類,功能強大。
Math.random()方法
Math.random()方法是 Java 的一個靜態方法,返回一個0到1之間,前閉後開區間的double值。
(int)(Math.random()*10) 返回0到9的隨機整數。
(int)(Math.random()*n) 返回0到n的隨機整數。
(int)(Math.random()*100)+1 返回1到100之間的隨機整數,前面返回0到99之間的隨機數,加1就成了1到100之間的隨機數。
Random類
Random 類是 Java 的 util 包中的一個類。
一、Random類使用說明
- Random類使用的根本策略是分帶種子和不帶種子的Random的例項。
通俗說,兩者的區別是:帶種子的,每次執行生成的結果都是一樣的。
不帶種子的,每次執行生成的都是隨機的,沒有規律可言。 - 建立不帶種子的Random物件
Random random = new Random();
使用一個和當前系統時間對應的相對時間有關的數字作為種子數。 - 建立帶種子的Random物件有兩種方法:
1) Random random = new Random(10);
2) Random random = new Random();random.setSeed(10);
種子的作用是什麼?
種子就是產生隨機數的第一次使用值,機制是通過一個函式,將這個種子的值轉化為隨機數空間中的某一個點上,並且產生的隨機數均勻的散佈在空間中。以後產生的隨機數都與前一個隨機數有關。
舉例:
Random r =new Random(100);
System.out.println(r.nextInt(20));
100是種子,r.nextInt(20)中的20是隨機數的上限,產生的隨機數為0-20的整數,不包括20,種子數只是隨機演算法的起源數字,和生成的隨機數字的區間沒有任何關係。
初始化時100並沒有起直接作用(注意:不是沒有起作用)。
二、下面是Java.util.Random類的方法摘要
- protected int next(int bits):生成下一個偽隨機數。
- boolean nextBoolean():返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分佈的boolean值。
- void nextBytes(byte[] bytes):生成隨機位元組並將其置於使用者提供的 byte 陣列中。
- double nextDouble():返回下一個偽隨機數,它是取自此隨機數生成器序列的、在0.0和1.0之間均勻分佈的 double值。
- float nextFloat():返回下一個偽隨機數,它是取自此隨機數生成器序列的、在0.0和1.0之間均勻分佈float值。
- double nextGaussian():返回下一個偽隨機數,它是取自此隨機數生成器序列的、呈高斯(“正態”)分佈的double值,其平均值是0.0標準差是1.0。
- int nextInt():返回下一個偽隨機數,它是此隨機數生成器的序列中均勻分佈的 int 值。
- int nextInt(int n):返回一個偽隨機數,它是取自此隨機數生成器序列的、在(包括和指定值(不包括)之間均勻分佈的int值。
- long nextLong():返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分佈的 long 值。
- void setSeed(long seed):使用單個 long 種子設定此隨機數生成器的種子。
總結:
1. 同一個種子,生成N個隨機數,當你設定種子的時候,這N個隨機數是什麼已經確定。相同次數生成的隨機數字是完全相同的。
2. 如果用相同的種子建立兩個 Random 例項,則對每個例項進行相同的方法呼叫序列,它們將生成並返回相同的數字序列。
3. Java的隨機數都是通過演算法實現的,Math.random()本質上屬於Random()類。
4. 使用java.util.Random()會相對來說比較靈活一些,可以產生正態、高斯、均勻分佈的隨機數。
為什麼說Java中的隨機數都是偽隨機數?什麼是偽隨機數?
- 偽隨機數是看似隨機實質是固定的週期性序列,也就是有規則的隨機。
- 只要這個隨機數是由確定演算法生成的,那就是偽隨機,只能通過不斷演算法優化,使你的隨機數更接近隨機。
(隨機這個屬性和演算法本身就是矛盾的) - 通過真實隨機事件取得的隨機數才是真隨機數。
Java隨機數產生原理
Java的隨機數產生是通過線性同餘公式產生的,也就是說通過一個複雜的演算法生成的。
偽隨機數的不安全性
Java自帶的隨機數函式是很容易被黑客破解的,因為黑客可以通過獲取一定長度的隨機數序列來推出你的seed,然後就可以預測下一個隨機數。