java 提高随机数效率_JAVA优化篇2-生成3-10之间随机数的方法(高并发下优化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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值