Java – Generate random integers in a range 修改教程

![java-random-integer-in-range][] java-random-integer-in-range

In this article, we will show you three ways to generate random integers in a range.

  1. java.util.Random.nextInt
  2. Math.random
  3. java.util.Random.ints (Java 8)

1. java.util.Random

This Random().nextInt(int bound) generates a random integer from 0 (inclusive) to bound (exclusive).

1.1 Code snippet. For getRandomNumberInRange(5, 10), this will generates a random integer between 5 (inclusive) and 10 (inclusive).

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 What is (max – min) + 1) + min?

Above formula will generates a random integer in a range between min (inclusive) and max (inclusive).

//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 Full examples to generate 10 random integers in a range between 5 (inclusive) and 10 (inclusive).

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;
    }

}

Output.

7
6
10
8
9
5
7
10
8
5

2. Math.random

This Math.random() gives a random double from 0.0 (inclusive) to 1.0 (exclusive).

2.1 Code snippet. Refer to 1.2, more or less it is the same formula.

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

2.2 Full examples to generate 10 random integers in a range between 16 (inclusive) and 20 (inclusive).

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;
    }

}

Output.

17
16
20
19
20
20
20
17
20
16

Note
The Random.nextInt(n) is more efficient than Math.random() * n, read this Oracle forum post.

3. Java 8 Random.ints

In Java 8, new methods are added in java.util.Random

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

This Random.ints(int origin, int bound) or Random.ints(int min, int max) generates a random integer from origin (inclusive) to bound (exclusive).

3.1 Code snippet.

private static int getRandomNumberInRange(int min, int max) {

        Random r = new Random();
        return r.ints(min, (max + 1)).findFirst().getAsInt();

    }

3.2 Full examples to generate 10 random integers in a range between 33 (inclusive) and 38 (inclusive).

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();

    }

}

Output.

34
35
37
33
38
37
34
35
36
37

3.3 Extra, for self-reference.

Generates random integers in a range between 33 (inclusive) and 38 (exclusive), with stream size of 10. And print out the items with forEach.

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

Output.

34
37
37
34
34
35
36
33
37
34

References

  1. java.util.Random JavaDoc
  2. java.lang.Math JavaDoc
  3. Oracle forum : Random Number Generation
  4. Generating weighed random numbers in JavaScript

[java-random-integer-in-range]:

如果觉得JSRUN的教程对您有用,请随意打赏。您的支持将鼓励JSRUN继续提供更好的服务

捐助JSRUN
JSRUN前端教程共编系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的本前端教程,让知识的积累变得统一完整、自成体系。 希望广大工程师能一起参与进共编,让零散在世界各处的知识点找到组织、找到家。
X
支付宝
9.99
请使用支付宝扫码支付, 有效时间 5分0秒
超过有效时间后请立即停止支付。
支付故障请联系QQ:565830900
因10.00元通道已占用,系统建议您支付9.99元
正在生成二维码, 此过程可能需要15秒钟
谢谢支持,我一定会更加努力的