首頁 > 軟體

Java生成範圍內隨機整數的三種方法

2022-07-19 14:04:11

前言

在本文中,我們將向您展示三種生成範圍內隨機整數的方法。

  • java.util.Random.nextInt
  • 數學隨機
  • java.util.Random.ints(Java 8)

1. java.util.Random

此Random().nextInt(int bound)生成一個從0(含)到bound( Random().nextInt(int bound)的隨機整數。

1.1程式碼段。 對於getRandomNumberInRange(5, 10) ,這將生成一個介於5(含)和10(含)之間的隨機整數。

private static int getRandomNumberInRange(int min, int max) {
        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }
 
        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }

1.2什麼是(max – min)+ 1)+ min?

上面的公式將在min(含)和max(含)之間生成一個隨機整數。

//Random().nextInt(int bound) = Random integer from 0 (inclusive) to bound (exclusive)
    
    //1. nextInt(range) = nextInt(max - min)
    new Random().nextInt(5);  // [0...4] [min = 0, max = 4]
    new Random().nextInt(6);  // [0...5]
    new Random().nextInt(7);  // [0...6]
    new Random().nextInt(8);  // [0...7]
    new Random().nextInt(9);  // [0...8]
    new Random().nextInt(10); // [0...9]            
    new Random().nextInt(11); // [0...10]
    
    //2. To include the last value (max value) = (range + 1)
    new Random().nextInt(5 + 1)  // [0...5] [min = 0, max = 5]
    new Random().nextInt(6 + 1)  // [0...6]
    new Random().nextInt(7 + 1)  // [0...7]
    new Random().nextInt(8 + 1)  // [0...8]
    new Random().nextInt(9 + 1)  // [0...9]
    new Random().nextInt(10 + 1) // [0...10]            
    new Random().nextInt(11 + 1) // [0...11]
    
    //3. To define a start value (min value) in a range,
    //   For example, the range should start from 10 = (range + 1) + min
    new Random().nextInt(5 + 1)  + 10 // [0...5]  + 10 = [10...15]
    new Random().nextInt(6 + 1)  + 10 // [0...6]  + 10 = [10...16]
    new Random().nextInt(7 + 1)  + 10 // [0...7]  + 10 = [10...17]
    new Random().nextInt(8 + 1)  + 10 // [0...8]  + 10 = [10...18]
    new Random().nextInt(9 + 1)  + 10 // [0...9]  + 10 = [10...19]
    new Random().nextInt(10 + 1) + 10 // [0...10] + 10 = [10...20]
    new Random().nextInt(11 + 1) + 10 // [0...11] + 10 = [10...21]
    
    // Range = (max - min)
    // So, the final formula is ((max - min) + 1) + min
    
    //4. Test [10...30]
    // min = 10 , max = 30, range = (max - min)
    new Random().nextInt((max - min) + 1) + min
    new Random().nextInt((30 - 10) + 1) + 10
    new Random().nextInt((20) + 1) + 10
    new Random().nextInt(21) + 10    //[0...20] + 10 = [10...30]
    
    //5. Test [15...99]
    // min = 15 , max = 99, range = (max - min)
    new Random().nextInt((max - min) + 1) + min
    new Random().nextInt((99 - 15) + 1) + 15
    new Random().nextInt((84) + 1) + 15
    new Random().nextInt(85) + 15    //[0...84] + 15 = [15...99]
    
    //Done, understand?

1.3完整範例生成10個隨機整數,範圍在5(含)和10(含)之間。

TestRandom.java

package com.mkyong.example.test;
import java.util.Random;
public class TestRandom {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomNumberInRange(5, 10));
        }
 
    }
 
    private static int getRandomNumberInRange(int min, int max) {
        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }
 
        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }
}

輸出。

7
6
10
8
9
5
7
10
8
5

2.數學隨機

此Math.random()給出從0.0(含)到1.0( Math.random()的隨機雙Math.random() 。

2.1程式碼段。 參考1.2,或多或少是相同的公式。

(int)(Math.random() * ((max - min) + 1)) + min

2.2完整範例生成10個隨機整數,範圍在16(含)和20(含)之間。

TestRandom.java
package com.mkyong.example.test;
public class TestRandom {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomNumberInRange(16, 20));
        }
    }
 
    private static int getRandomNumberInRange(int min, int max) {
        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }
        return (int)(Math.random() * ((max - min) + 1)) + min;
    }
}

輸出。

17
16
20
19
20
20
20
17
20
16

注意

請閱讀Oracle論壇貼文 , Random.nextInt(n)比Math.random() * n更有效。

3. Java 8 Random.ints

在Java 8中,在java.util.Random中新增了新方法

public IntStream ints(int randomNumberOrigin, int randomNumberBound)
    public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)

此Random.ints(int origin, int bound)或Random.ints(int min, int max)生成一個從原點(包含)到bound(不包含)的隨機整數。

3.1程式碼段。

private static int getRandomNumberInRange(int min, int max) {
        Random r = new Random();
        return r.ints(min, (max + 1)).findFirst().getAsInt();
    }

3.2完整範例生成10個隨機整數,範圍在33(含)和38(含)之間。

TestRandom.java
package com.mkyong.form.test;
import java.util.Random;
public class TestRandom {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(getRandomNumberInRange(33, 38));
        }
    }
 
    private static int getRandomNumberInRange(int min, int max) {
        Random r = new Random();
        return r.ints(min, (max + 1)).limit(1).findFirst().getAsInt();
    }
}

輸出。

34
35
37
33
38
37
34
35
36
37

3.3額外內容,僅供參考。

生成介於33(含)和38(不含)之間的隨機整數,流大小為10。並使用forEach列印出專案。

//Java 8 only
    new Random().ints(10, 33, 38).forEach(System.out::println);

輸出。

34
37
37
34
34
35
36
33
37
34

參考文獻

  1. java.util.Random JavaDoc
  2. java.lang.Math JavaDoc
  3. Oracle論壇:亂數生成
  4. 在JavaScript中生成加權亂數

翻譯自: https://mkyong.com/java/java-generate-random-integers-in-a-range/

總結

到此這篇關於Java生成範圍內隨機整數的三種方法的文章就介紹到這了,更多相關Java生成隨機整數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com