当前位置: 代码迷 >> J2SE >> java产生随机数的疑惑解决方案
  详细解决方案

java产生随机数的疑惑解决方案

热度:138   发布时间:2016-04-24 02:19:26.0
java产生随机数的疑惑
Java code
package cn.ffcs.ct10000.card;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;public class TTEST {    public static String getCurrStrTime(int type){        Date date = new Date();        DateFormat formatter = null;        if(type == 1){            formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        }else if(type == 2){            formatter = new SimpleDateFormat("yyyy-MM");    //检查每月一次的业务        }else if(type == 3){            formatter = new SimpleDateFormat("yyyyMMddHHmmss");        }else{            //默认            formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        }                return formatter .format(date);    }            public static String getSno() {        Random rdm = new Random();        int i = rdm.nextInt(1000000)+1000000;        String str = "nx" + getCurrStrTime(3) + String.valueOf(i).substring(1,7);        return str;                }    public static void suijishu(){        //获得一个从100000到999999之间的整数        Random rdm = new Random();        for(int i=0; i<1000;i++){            int j;            j = rdm.nextInt(1000000)+1000000;            String str = "nx" + getCurrStrTime(3) + String.valueOf(j).substring(1,7);            System.out.println(str);        }    }            public static void t1(){        for(int i=0;i<100;i++){            String sno = getSno();            if(sno.length() != 2){                System.out.println(sno);            }        }            }        public static void t2(){        suijishu();    }    /**     * @param args     */    public static void main(String[] args) {//        t1();        t2();    }}

==============
为什么t1()就会出现很多一样的号码,而t2()则几乎每次出来的数都不一样?
难道我用getSno()来取得一个随机数,取到一样id的情况很多吗?
请高人指点!

------解决方案--------------------
java的 Random返回的是一个伪随机数。

如果要保证不同,可以使用当前时间作为随机种子。
------解决方案--------------------
使用 common.lang String str = RandomStringUtils.random(16, true, true);产生一个16为的数字与字母结合的uuid
------解决方案--------------------
java的 Random返回的是一个伪随机数。
产生的随机数是否相同取决于随机数对象的状态,而随机数对象的状态取决于它们是否是同一个随机数对象。
 Random rdm = new Random();表示创建一个随机数对象,所以用rdm来产生的随机数都一样,除非重新创建新的随机数对象。

t1()只创建一次随机数对象,后面产生的随机数都是用到第一次创建的随机数对象,所以结果都相同。
而t2()采取调用suijishu();的方式来产生随机数,每调用一次suijishu();就创建一个新的随机数对象,所以肌肤每次都不同。
  相关解决方案