java产生随机数的疑惑解决方案
java产生随机数的疑惑
==============
为什么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();就创建一个新的随机数对象,所以肌肤每次都不同。
- 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();就创建一个新的随机数对象,所以肌肤每次都不同。