Java生成范围内随机整数的三种方法

 更新时间:2022年07月19日 09:41:05   作者:cyan20115  
在Java中生成随机数的场景有很多,下面这篇文章主要给大家介绍了关于Java生成范围内随机整数的三种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

在本文中,我们将向您展示三种生成范围内随机整数的方法。

  • 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生成随机整数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring Bean创建的完整过程记录

    spring Bean创建的完整过程记录

    这篇文章主要给大家介绍了关于Spring中Bean实例创建的相关资料,文中通过实例代码和图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • java服务器端微信、支付宝支付和退款功能

    java服务器端微信、支付宝支付和退款功能

    这篇文章主要为大家详细介绍了java服务器端微信、支付宝支付和退款功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 详解Mybatis的二级缓存配置

    详解Mybatis的二级缓存配置

    这篇文章主要介绍了Mybatis的二级缓存配置的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java基于zxing生成二维码矩阵过程解析

    Java基于zxing生成二维码矩阵过程解析

    这篇文章主要介绍了Java基于zxing生成二维码矩阵过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 解决启用 Spring-Cloud-OpenFeign 配置可刷新项目无法启动的问题

    解决启用 Spring-Cloud-OpenFeign 配置可刷新项目无法启动的问题

    这篇文章主要介绍了解决启用 Spring-Cloud-OpenFeign 配置可刷新项目无法启动的问题,本文重点给大家介绍Spring-Cloud-OpenFeign的原理及问题解决方法,需要的朋友可以参考下
    2021-10-10
  • java判断字符串是否为null的四种方式汇总

    java判断字符串是否为null的四种方式汇总

    这篇文章主要介绍了java判断字符串是否为null的四种方式汇总,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java中 String和StringBuffer的区别实例详解

    java中 String和StringBuffer的区别实例详解

    这篇文章主要介绍了java中 String和StringBuffer的区别实例详解的相关资料,一个小的例子,来测试String和StringBuffer在时间和空间使用上的差别,需要的朋友可以参考下
    2017-04-04
  • Spring Boot实现微信小程序登录

    Spring Boot实现微信小程序登录

    这篇文章主要为大家详细介绍了Spring Boot实现微信小程序登录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Spring计时器StopWatch使用示例

    Spring计时器StopWatch使用示例

    这篇文章主要介绍了Spring计时器StopWatch使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java多线程 实例解析

    Java多线程 实例解析

    这篇文章主要介绍了Java多线程 实例解析,需要的朋友可以参考下
    2017-04-04

最新评论