当前位置:   article > 正文

java 提高随机数效率_JAVA优化篇2-生成3-10之间随机数的方法(高并发下优化Random)...

java random效率

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

场景1:因为key同一时间失效造成的缓存雪崩;

场景2:线程在请求分布式锁失败时,每隔单位时间请求一次;

需求:

当传参为"3"时,那么返回固定的3;

当传参为"3-10"时,返回[3-10]区间的某个随机数;

思路:

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

相关方法:

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;

}

}

生成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;

}

}

1694ef9b3b93

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

}

}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/84051
推荐阅读
相关标签
  

闽ICP备14008679号