Java——隨機數(Random()函數)

Java中存在着兩種Random函數:

一、java.lang.Math.Random

  Math.random()方法生成大於等於0.0且小於1.0的double型隨機數(0.0<=Math.random<1.0),返回值是一個僞隨機選擇的數,在該範圍內(近似)均勻分佈。舉一個小例子:

public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            int r = (int) (Math.random() * 100);
            System.out.println("number is " + r);
        }
    }
}

注意:Math.Random()函數返回的是double類型的值,所以在要賦值給其他類型的變量的時候注意需要進行類型轉換。
  此方法是完全同步的,可允許多個線程使用而不出現錯誤。但是,如果許多線程需要以極高的速率生成僞隨機數,那麼這可能會減少每個線程對擁有自己僞隨機數生成器的爭用。

二、java.util.Random

  1. java.util.Random類中實現的隨機算法也是僞隨機的,Random類中各方法生成的隨機數字都是均勻分佈的,也就是說區間內部的數字生成的機率均等;
  2. 相同種子數的Random對象,相同次數生成的隨機數字是完全相同的。

Random()的兩種構造方法:

  1. Random():以當前時間作爲種子創建一個Random對象,並且採用線性同餘法計算下一個隨機數。
  2. Random(long seed):使用特定值作爲種子創建一個Random對象。

提示:種子是一個用於初始化一個隨機數字生成器的數字,如果兩個Random對象有相同的種子,那它們會產生相同的數列。

方法 說明
nextInt( ) : int 返回一個隨機的int值
nextInt(n : int): int 返回一個0到n(不包含n)之間的隨機int類型的值
nextLong( ) : long 返回一個隨機的long值
nextFloat( ) : float 返回一個0.0到1.0(不包含1.0F)之間的隨機float類型的值
nextDouble( ) : double 返回一個0.0到1.0(不包含1.0)之間的隨機double類型的值
nextBoolean( ) : boolean 返回一個隨機的boolean值

 
舉一個小例子:

import java.util.Random;

public class Demo {
    public static void main(String[] args) {
        Random random1 = new Random(100);
        System.out.print("random1: ");
        for (int i = 0; i < 10; i++) {
            System.out.print(random1.nextInt(1000) + " ");
        }
        System.out.println();
        Random random2 = new Random(100);
        System.out.print("random2: ");
        for (int i = 0; i < 10; i++) {
            System.out.print(random2.nextInt(1000) + " ");
        }
    }
}

它產生相同的int類型的隨機數列:
結果

最後簡單對比一下這兩個隨機函數的特點:
1. java.Math.Random()實際是在內部調用java.util.Random()的;
2. java.util.Random()在調用的時候可以實現和java.Math.Random()一樣的功能,而且它有更多的調用方法,相對來說比較靈活;
3. 二者都是弱隨機數,弱僞隨機數PRNG實現 java.util.Random類,默認使用當前時間作爲種子,並且採用線性同餘法計算下一個隨機數;強僞隨機數RNG實現java.security.SecureRandom類,該類使用臨時文件夾中大小,線程休眠時間等的值作爲隨機數種子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章