1. 程式人生 > >java 生成某個區間的隨機數

java 生成某個區間的隨機數

生成指定範圍內的隨機數,這個是最常用的技術之一。程式設計師希望通過隨機數的方式來處理眾多的業務邏輯,測試過程中也希望通過隨機數的方式生成包含大量數字的測試用例。問題往往類似於: 如何隨機生成 1~100 之間的隨機數,取值包含邊界值 1 和 100。或者是:如何隨機生成隨機的3位整數?等等…… 以 Java 語言為例,我們觀察其 Random 物件的 nextInt(int) 方法,發現這個方法將生成 0 ~ 引數之間隨機取值的整數。例如(假設先有 Random rand = new Random();,下同): rand.nextInt(100); 這行程式碼將生成範圍 0~100 之間的隨機數,有趣的是,取值可能為 0 ,但不可能為 100。我們用中學數學課學習的區間表示法,表示為:[0, 100)。那麼如果要獲得區間 [1~100] 的隨機數,該怎麼辦呢?稍微動動腦筋就可以想到:區間 [0, 100) 內的整數,實際上就是區間 [0, 99]。因為最大邊界為100,可惜不能等於100,因此最大可能產生的“整數”就是99。既然 rand.nextInt(100) 獲得的值是區間 [0, 99],那麼在這個區間左右各加 1,就得到了區間 [1, 100]。因此,程式碼寫成: rand.nextInt(100) + 1; 即可。執行下面的程式碼,將獲得 [1, 100] 的 10 個取值。

  1. import java.util.Random;

  2. public class Test {

  3. public static void main(String[] args){

  4. Random rand = new Random();

  5. for(int i=0; i<10; i++) {

  6. System.out.println(rand.nextInt(100) + 1);

  7. }

  8. }

  9. }

編譯執行,輸出結果為: 81 64 31 86 56 14 45 57 28 90 多次執行,結果每次都不同,但取值一定會在 1 和 100 之間,可能出現 1 和 100。同理,很容易知道如果要獲得隨機兩位整數,程式碼寫成: rand.nextInt(90) + 10; 你一定很驚訝,為什麼是這麼寫出來的。其實,在 nextInt() 方法中作為引數的數字 90 表示:你希望生成的隨機數的所有取值的可能性的數量(在本命題中,兩位整數取值為 [10, 99],共90個數);加好後面的數字 10 ,表示區間的最小取值。 你可以驗證下,按照這樣理解,[1, 100] 的隨機數,是不是應該寫成 rand.nextInt(100) + 1 。千萬不要把引數 100 理解為最大取值。只是區間 [1, 100] 正好從 1 開始,所以最大取值和取值可能性數量正好同為 100。因此, 生成隨機三位數的程式碼為: rand.nextInt(900) + 100;生成區間 [64, 128] 中隨機值的程式碼為: rand.nextInt(65) + 64; 取值可能性的數量是如何計算出來的呢?當然是 最大取值-最小取值+1 ,所以,有最終公式如下: int randNumber = rand.nextInt(MAX - MIN + 1) + MIN; // randNumber 將被賦值為一個 MIN 和 MAX 範圍內的隨機數