美文网首页
JAVA优化篇2-生成3-10之间随机数的方法(高并发下优化Ra

JAVA优化篇2-生成3-10之间随机数的方法(高并发下优化Ra

作者: 小胖学编程 | 来源:发表于2020-09-15 11:09 被阅读0次

在实际项目开发中,需要生成某个范围内的随机数。

场景1:因为key同一时间失效造成的缓存雪崩;
场景2:线程在请求分布式锁失败时,每隔单位时间请求一次;

需求:

  1. 当传参为"3"时,那么返回固定的3;
  2. 当传参为"3-10"时,返回[3-10]区间的某个随机数;

思路:

使用Java的Random类是生成随机数。

相关方法:

1. 初始版

  1. 生成int类型:

注意,生成的区间是[3,10]前闭后闭区间,即3和10都有机会命中。

    /**
     * @param digit 格式1:"3-10",那么生成的便是[3,10]之间的一个随机数;
     *              格式2:"3"那么生成的便是3这个随机数
     * @return 随机整数
     */
    public static int randomIntIfRange(String digit) {
        String[] digits = digit.split("-");
        //判断格式
        if (digits.length == 1) {
            return Integer.valueOf(digits[0]);
        } else {
            int d0 = Integer.valueOf(digits[0]);
            int d1 = Integer.valueOf(digits[1]);
            //取差值
            int interval = d0 < d1 ? d1 - d0 : d0 - d1;
            //取最小值
            int min = d0 < d1 ? d0 : d1;
            //获取随机数对象
            Random random = new Random();
            return random.nextInt(interval) + min;
        }
    }
  1. 生成long类型

Random没有提供带有边界值的long生成方法。我们采用的方式是取余获取到一个差值区间的随机数,例如3-10,得到的差值是7,取余后为0-6,那么加上最小值得到的随机数区间是3-9。即[3,10)区间的值。

    /**
     * @param digit 格式1:"3-10"生成的便是[3,10)之间的一个随机数;
     *              格式2:"3"生成的便是3这个随机数
     * @return 随机长整数
     */
    public static long randomLongIfRange(String digit) {
        String[] digits = digit.split("-");
        //判断格式
        if (digits.length == 1) {
            return Long.valueOf(digits[0]);
        } else {
            long d0 = Long.valueOf(digits[0]);
            long d1 = Long.valueOf(digits[1]);
            //取差值
            long interval = d0 < d1 ? d1 - d0 : d0 - d1;
            //取最新值
            long min = d0 < d1 ? d0 : d1;
            //获取随机数
            Random random = new Random();
            return Math.abs(random.nextLong() % interval) + min;
        }
    }
image.png

2. 改进版

每一次生成随机数时,都要去new一个Random对象。性能可能存在瓶颈,Random虽然是线程安全的,但是会存在竞争一个seed导致性能下降,所以推荐使用ThreadLocalRandom来进行处理。

    /**
     * 生成一个int类型的随机数
     *
     * @param digit 格式1:"3-10",那么生成的便是[3,10]之间的一个随机数;
     *              格式2:"3"那么生成的便是3这个随机数
     * @return 随机整数
     */
    public static int randomIntIfRange(String digit) {
        String[] digits = digit.split("-");
        //判断格式
        if (digits.length == 1) {
            return Integer.valueOf(digits[0]);
        } else {
            int d0 = Integer.valueOf(digits[0]);
            int d1 = Integer.valueOf(digits[1]);
            int min = d0 < d1 ? d0 : d1;
            int max = d0 > d1 ? d0 : d1;
            //获取随机数
            return ThreadLocalRandom.current().nextInt(min,max);
        }
    }
    /**
     * 生成一个long类型的随机数
     *
     * @param digit 格式1:"3-10"生成的便是[3,10)之间的一个随机数;
     *              格式2:"3"生成的便是3这个随机数
     * @return 随机长整数
     */
    public static long randomLongIfRange(String digit) {
        String[] digits = digit.split("-");
        //判断格式
        if (digits.length == 1) {
            return Long.valueOf(digits[0]);
        } else {
            long d0 = Long.valueOf(digits[0]);
            long d1 = Long.valueOf(digits[1]);
            //取最新值
            long min = d0 < d1 ? d0 : d1;
            long max = d0 > d1 ? d0 : d1;
            //获取随机数
            return ThreadLocalRandom.current().nextLong(min, max);
        }
    }

相关文章

网友评论

      本文标题:JAVA优化篇2-生成3-10之间随机数的方法(高并发下优化Ra

      本文链接:https://www.haomeiwen.com/subject/qcnxyktx.html