介绍两种随机生成数字串的方法,该方法生成的随机串,小概率情况下会产生重复值,因此该方法只可用于生成验证码,不可以用于生成数字串类型的主键。还有一篇关于生成不重复的数字串的文章。如有不正之处,欢迎批评指正。
方法一:效率高,但是最大可以生成 19 位数字串
/**
* 随机生产 factor 位的数字,最大不超过 19位,因为long的最大值为19位
* @param factor
* @return
*/
public static Long randomNum(int factor){
return new Double((Math.random() + 1) * Math.pow(10, factor - 1)).longValue();
}
方法二:效率低于方法一,但是它可以生成任意位数的数字串,同时可以扩展为生成数组字母串,见方法三
public static String characters = "0123456789";
public static String randomNum1(int factor){
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < factor; i++) {
// nextInt(10) = [0, 10)
sb.append(characters.charAt(random.nextInt(10)));
}
return sb.toString();
}
对方法一、方法二做了简单的测试,结果如下:方法一的效率大致为方法二的10倍,而且随着生成的字符串的长度的增加,两者的差距逐步加大。
随机生成 10 位数字串,生成 1000000 次耗时:
randomNum used 49 ms
randomNum1 used 307 ms
随机生成 19 位数字串,生成 1000000 次耗时:
randomNum used 49 ms
randomNum1 used 457 ms
随机生成 10 位数字串,生成 10000000 次耗时:
randomNum used 280 ms
randomNum1 used 2283 ms
随机生成 19 位数字串,生成 10000000 次耗时:
randomNum used 309 ms
randomNum1 used 3675 ms
方法三:生成指定位数的数字字母串
public static String characters1 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String randomStr(int factor){
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < factor; i++) {
// nextInt(10) = [0, 10)
sb.append(characters1.charAt(random.nextInt(36)));
}
return sb.toString();
}
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx