日期:2014-05-20  浏览次数:20780 次

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();就创建一个新的随机数对象,所以肌肤每次都不同。