7. 如何在Java中生成特定范围内的随机整数?| Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

提问:如何在Java中生成特定范围内的随机整数?

如何生成int特定范围内的随机值?

我已经尝试了以下方法,但是这些方法不起作用:

尝试1:

randomNum = minimum + (int)(Math.random() * maximum);
复制代码

错误:randomNum可以大于maximum。

尝试2:

Random rn = new Random();
int n = maximum - minimum + 1;
int i = rn.nextInt() % n;
randomNum =  minimum + i;
复制代码

错误:randomNum可以小于minimum。

热门回答:
在Java 1.7或更高版本中,执行此操作的标准方法如下:

import java.util.concurrent.ThreadLocalRandom;

// nextInt方法通常不包括最大值,
// 所以通过加1的方法,使结果集包含最大值
int randomNum = ThreadLocalRandom.current().nextInt(min, max + 1);
复制代码

这种方法的优点是不需要显式初始化java.util.Random实例,如果使用不当,可能会出现问题。

但是,没有办法显式的设置参数min,max。因此,在需要设置参数的用户场景的情况下(例如,测试或者保存游戏状态的情况),可以使用Java 1.7以前的实现这类问题的标准化方法。

import java.util.Random;
public static int randInt(int min, int max) {
    // 特别注意下:这个原文写的不是很能让人理解,他用注释代替了代码本身,所以他没有初始化rand,我在这里更改了下
    Random rand = new Random();
    // 该作者有意的写的没有很标准,所以想通过ctrl cv解决问题的同学们
    // 需要考虑如何初始化rand。具体如何初始化并不在问题的主要考虑范围内(要分清主要矛盾和次要矛盾)
    // 只要注意不要像本人一样直接默认seed就好,这样会使结果不够随机
    // 通过一些参数可以让rand只需初始化一次并能够多次使用
    // 或者使用ThreadLocalRandom(java 1.7及以后版本)
    
    // nextInt方法通常不包括最大值,
    // 所以通过加1的方法,使结果集包含最大值
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享