1. 程式人生 > >java隨機數的生成

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類使用說明

  1. Random類使用的根本策略是分帶種子和不帶種子的Random的例項。 
    通俗說,兩者的區別是:帶種子的,每次執行生成的結果都是一樣的。 
    不帶種子的,每次執行生成的都是隨機的,沒有規律可言。
  2. 建立不帶種子的Random物件 
    Random random = new Random(); 
    使用一個和當前系統時間對應的相對時間有關的數字作為種子數。
  3. 建立帶種子的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類的方法摘要

  1. protected int next(int bits):生成下一個偽隨機數。
  2. boolean nextBoolean():返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分佈的boolean值。
  3. void nextBytes(byte[] bytes):生成隨機位元組並將其置於使用者提供的 byte 陣列中。
  4. double nextDouble():返回下一個偽隨機數,它是取自此隨機數生成器序列的、在0.0和1.0之間均勻分佈的 double值。
  5. float nextFloat():返回下一個偽隨機數,它是取自此隨機數生成器序列的、在0.0和1.0之間均勻分佈float值。
  6. double nextGaussian():返回下一個偽隨機數,它是取自此隨機數生成器序列的、呈高斯(“正態”)分佈的double值,其平均值是0.0標準差是1.0。
  7. int nextInt():返回下一個偽隨機數,它是此隨機數生成器的序列中均勻分佈的 int 值。
  8. int nextInt(int n):返回一個偽隨機數,它是取自此隨機數生成器序列的、在(包括和指定值(不包括)之間均勻分佈的int值。
  9. long nextLong():返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分佈的 long 值。
  10. void setSeed(long seed):使用單個 long 種子設定此隨機數生成器的種子。

總結: 
1. 同一個種子,生成N個隨機數,當你設定種子的時候,這N個隨機數是什麼已經確定。相同次數生成的隨機數字是完全相同的。 
2. 如果用相同的種子建立兩個 Random 例項,則對每個例項進行相同的方法呼叫序列,它們將生成並返回相同的數字序列。 
3. Java的隨機數都是通過演算法實現的,Math.random()本質上屬於Random()類。 
4. 使用java.util.Random()會相對來說比較靈活一些,可以產生正態、高斯、均勻分佈的隨機數。

為什麼說Java中的隨機數都是偽隨機數?什麼是偽隨機數?

  1. 偽隨機數是看似隨機實質是固定的週期性序列,也就是有規則的隨機。
  2. 只要這個隨機數是由確定演算法生成的,那就是偽隨機,只能通過不斷演算法優化,使你的隨機數更接近隨機。 
      (隨機這個屬性和演算法本身就是矛盾的)
  3. 通過真實隨機事件取得的隨機數才是真隨機數。

Java隨機數產生原理

Java的隨機數產生是通過線性同餘公式產生的,也就是說通過一個複雜的演算法生成的。

偽隨機數的不安全性

Java自帶的隨機數函式是很容易被黑客破解的,因為黑客可以通過獲取一定長度的隨機數序列來推出你的seed,然後就可以預測下一個隨機數。