赞
踩
在实际项目开发中,需要生成某个范围内的随机数。
场景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;
}
}
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);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。