美文网首页
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