论坛首页 Java企业应用论坛

巧用RandomStringUtils生成随机数

浏览 18710 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-25   最后修改:2010-01-25

Java提供的随机数工具,或者第三方提供的随机数工具,都不能满足我的需求:产生指定位数且大于0的整数(可以做为ID使用)

        在使用commons-langRandomStringUtils类时,有一个方法引起了我的注意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)] + "";
	}
}

  

 

   发表时间:2010-01-25  
0 请登录后投票
   发表时间:2010-01-25  
话说,

Random rand = new Random();
return rand.nextInt((long)Math.pow(10, digit));

这样不就行了么。。。
0 请登录后投票
   发表时间:2010-01-25  
还有啊,
throw new RuntimeException(new IllegalArgumentException("minDigit > maxDigit"));
这样的Exception有什么意义。。。
那个。。。lz是否知道IllegalArgumentException就是RuntimeException的子类?
0 请登录后投票
   发表时间:2010-01-25  
有这个东西的话不可以做数据库主键生成器了?
0 请登录后投票
   发表时间: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的子类,谢谢同学提醒~~~ ,我已经改过来了
0 请登录后投票
   发表时间:2010-01-25  
Arden 写道
有这个东西的话不可以做数据库主键生成器了?

是的,我也是基于这个原因而做这个工具的
0 请登录后投票
   发表时间:2010-01-25  
lazyman333 写道
Arden 写道
有这个东西的话不可以做数据库主键生成器了?

是的,我也是基于这个原因而做这个工具的

数据库主键生成器为什么不用UUID?
0 请登录后投票
   发表时间:2010-01-25  
不错,我以前也做过一个类似的东西,不过不是生成数字,而是一个固定长度的随机字符串,这个字符串随机取自a-z,0-9的字符,按照你这个需求,只需要从0-9里面随机取指定长度个数的元素组成一个固定的字符串,再把这个字符串转成数字即可,不知道有没有理解到你的需求。和你的不同是我没有用其它的第三方包,完全自己实现(因为不知道有这个东西),不过这种东西还是挺有意思的,呵呵
0 请登录后投票
   发表时间:2010-01-25  
geweixin 写道

数据库主键生成器为什么不用UUID?

我们需要生成的随机数要在一定的范围,比如数据需要在10-12位之间,因为数据库里某种ID值是在这个范围内,程序把这种定制的值传给数据库,使得相应数据被加载进内存,以测数据库在大数据量下的性能情况
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics