精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-25
最后修改:2010-01-25
Java提供的随机数工具,或者第三方提供的随机数工具,都不能满足我的需求:产生指定位数且大于0的整数(可以做为ID使用)。 在使用commons-lang的RandomStringUtils类时,有一个方法引起了我的注意RandomStringUtils.randomNumeric(int count),该方法返回指定数目的随机数字串,如果把返回的数字串解析成数字,不就可以产生随机数了么~~~~ 按照上面的思路,做了一下封装,代码如下:
package org.lazyman.util import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.math.RandomUtils; /** * @author yihuan * @version RandomNumberUtil.java 2010-1-14 上午11:39:20 */ public class RandomNumberUtil { private static final int[] prefix = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; /** * 随机产生最大为18位的long型数据(long型数据的最大值是9223372036854775807,共有19位) * * @param digit * 用户指定随机数据的位数 */ public static long randomLong(int digit) { if (digit >= 19 || digit <= 0) throw new IllegalArgumentException("digit should between 1 and 18(1<=digit<=18)"); String s = RandomStringUtils.randomNumeric(digit - 1); return Long.parseLong(getPrefix() + s); } /** * 随机产生在指定位数之间的long型数据,位数包括两边的值,minDigit<=maxDigit * * @param minDigit * 用户指定随机数据的最小位数 minDigit>=1 * @param maxDigit * 用户指定随机数据的最大位数 maxDigit<=18 */ public static long randomLong(int minDigit, int maxDigit) { if (minDigit > maxDigit) { throw new IllegalArgumentException("minDigit > maxDigit"); } if (minDigit <= 0 || maxDigit >= 19) { throw new IllegalArgumentException("minDigit <=0 || maxDigit>=19"); } return randomLong(minDigit + getDigit(maxDigit - minDigit)); } private static int getDigit(int max) { return RandomUtils.nextInt(max + 1); } /** * 保证第一位不是零 * * @return */ private static String getPrefix() { return prefix[RandomUtils.nextInt(9)] + ""; } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-25
|
|
返回顶楼 | |
发表时间:2010-01-25
话说,
Random rand = new Random(); return rand.nextInt((long)Math.pow(10, digit)); 这样不就行了么。。。 |
|
返回顶楼 | |
发表时间:2010-01-25
还有啊,
throw new RuntimeException(new IllegalArgumentException("minDigit > maxDigit")); 这样的Exception有什么意义。。。 那个。。。lz是否知道IllegalArgumentException就是RuntimeException的子类? |
|
返回顶楼 | |
发表时间:2010-01-25
有这个东西的话不可以做数据库主键生成器了?
|
|
返回顶楼 | |
发表时间:2010-01-25
stupidmxx 写道 话说,
Random rand = new Random(); return rand.nextInt((long)Math.pow(10, digit)); 这样不就行了么。。。 rand.nextInt(max)得到的结果是0到max-1的数, 而RandomNumberUtil.randLong(digit)产生的是指定位数的数,如果你传的参数是5,则返回结果是:10000到99999,同学仔细看看哦 IllegalArgumentException确实是RuntimeException的子类,谢谢同学提醒~~~ ,我已经改过来了 |
|
返回顶楼 | |
发表时间:2010-01-25
Arden 写道 有这个东西的话不可以做数据库主键生成器了?
是的,我也是基于这个原因而做这个工具的 |
|
返回顶楼 | |
发表时间:2010-01-25
lazyman333 写道 Arden 写道 有这个东西的话不可以做数据库主键生成器了?
是的,我也是基于这个原因而做这个工具的 数据库主键生成器为什么不用UUID? |
|
返回顶楼 | |
发表时间:2010-01-25
不错,我以前也做过一个类似的东西,不过不是生成数字,而是一个固定长度的随机字符串,这个字符串随机取自a-z,0-9的字符,按照你这个需求,只需要从0-9里面随机取指定长度个数的元素组成一个固定的字符串,再把这个字符串转成数字即可,不知道有没有理解到你的需求。和你的不同是我没有用其它的第三方包,完全自己实现(因为不知道有这个东西),不过这种东西还是挺有意思的,呵呵
|
|
返回顶楼 | |
发表时间:2010-01-25
geweixin 写道 数据库主键生成器为什么不用UUID? 我们需要生成的随机数要在一定的范围,比如数据需要在10-12位之间,因为数据库里某种ID值是在这个范围内,程序把这种定制的值传给数据库,使得相应数据被加载进内存,以测数据库在大数据量下的性能情况 |
|
返回顶楼 | |