论坛首页 Java企业应用论坛

巧用RandomStringUtils生成随机数

浏览 18724 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-25  
ialand 写道
不错,我以前也做过一个类似的东西,不过不是生成数字,而是一个固定长度的随机字符串,这个字符串随机取自a-z,0-9的字符,按照你这个需求,只需要从0-9里面随机取指定长度个数的元素组成一个固定的字符串,再把这个字符串转成数字即可,不知道有没有理解到你的需求。和你的不同是我没有用其它的第三方包,完全自己实现(因为不知道有这个东西),不过这种东西还是挺有意思的,呵呵

你理解得太到位了~~~ 其实commons-lang的RandomStringUtils.randomNumeric(int count)就相当于你实现的那个东西
0 请登录后投票
   发表时间:2010-01-26  
lazyman333 写道
Arden 写道
有这个东西的话不可以做数据库主键生成器了?

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

怎么保证不重复?
0 请登录后投票
   发表时间:2010-01-26  
扯 还DB 主键呢

randomNumeric的源码通读过了吗  做过严谨的测试吗

一眼看上去  这个函数的重复性不会比Random.nextInt小多少
0 请登录后投票
   发表时间:2010-01-26  
apache的工具包真是好多啊,这个没用过,谢谢分享~
0 请登录后投票
   发表时间:2010-01-26  
推荐使用JAVA 自带的UUID,
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长.

GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复

import java.util.UUID;
...
String id = UUID.randomUUID().toString();

0 请登录后投票
   发表时间:2010-01-26  
lazyman333 写道
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的子类,谢谢同学提醒~~~ ,我已经改过来了

好吧。。。原来是这样的需求。what about this?
long base = (long)Math.pow(10, digit);
return rand.nextInt(base*9) + base; // 产生0到89999之间的符合平均分布的随机数,再加上10000,成为10000到999999之间的符合平均分布的随机数。
0 请登录后投票
   发表时间:2010-01-26  
jd2bs 写道
扯 还DB 主键呢

randomNumeric的源码通读过了吗  做过严谨的测试吗

一眼看上去  这个函数的重复性不会比Random.nextInt小多少


的确做主键是不可取的,毕竟这只是个随机数生成器而不是有contract约定的随机序列生成器。但是lz哪里有说要做db主键了吗?
0 请登录后投票
   发表时间:2010-01-26  
jd2bs 写道
扯 还DB 主键呢

randomNumeric的源码通读过了吗  做过严谨的测试吗

一眼看上去  这个函数的重复性不会比Random.nextInt小多少



while(count-- != 0) 
        {
            char ch;
            if(chars == null)
                ch = (char)(random.nextInt(gap) + start);
            else
                ch = chars[random.nextInt(gap) + start];
            if(letters && numbers && Character.isLetterOrDigit(ch) || letters && Character.isLetter(ch) || numbers && Character.isDigit(ch) || !letters && !numbers)
                buffer.append(ch);
            else
                count++;
        }


这是randomNumeric 的实现代码, 它也是对random.nextInt 的封装
所以两者是相同的  ,或者  randomNumeric 更优 。 我没空继续读random.nextInt的实现。

而randomNumeric  是更符合应用的
0 请登录后投票
   发表时间:2010-01-26  
gqf2008 写道
lazyman333 写道
Arden 写道
有这个东西的话不可以做数据库主键生成器了?

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

怎么保证不重复?

会有重复的,这只是产生随机数而已,不产生惟一主键
0 请登录后投票
   发表时间:2010-01-26  
jd2bs 写道
扯 还DB 主键呢

randomNumeric的源码通读过了吗  做过严谨的测试吗

一眼看上去  这个函数的重复性不会比Random.nextInt小多少

离生成主键还远着呢,此处的用途不是为了产生db主键,生成的随机数是拿去访问db的,重复是允许的
0 请登录后投票
论坛首页 Java企业应用版

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