Java随机数总结.docx
《Java随机数总结.docx》由会员分享,可在线阅读,更多相关《Java随机数总结.docx(11页珍藏版)》请在冰豆网上搜索。
Java随机数总结
随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串、数字。
或者随即生成一个不定长度的数字、或者进行一个模拟的随机选择等等。
Java提供了最基本的工具,可以帮
关键字:
Java随机数总结 随机数在实际中使用很广泛,比如要随即生成一个固定长度的字符串、数字。
或者随即生成一个不定长度的数字、或者进行一个模拟的随机选择等等。
Java提供了最基本的工具,可以帮助开发者来实现这一切。
一、Java随机数的产生方式
在Java中,随机数的概念从广义上将,有三种。
1、通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。
2、通过Math.random()返回一个0到1之间的double值。
3、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。
二、Random类API说明
1、JavaAPI说明
Random类的实例用于生成伪随机数流。
此类使用48位的种子,使用线性同余公式对其进行修改(请参阅DonaldKnuth的《TheArtofComputerProgramming,Volume2》,第3.2.1节)。
如果用相同的种子创建两个Random实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。
为了保证属性的实现,为类Random指定了特定的算法。
很多应用程序会发现Math类中的random方法更易于使用。
2、方法摘要
Random()
创建一个新的随机数生成器。
Random(longseed)
使用单个long种子创建一个新随机数生成器:
publicRandom(longseed){setSeed(seed);}next方法使用它来保存随机数生成器的状态。
protectedintnext(intbits)
生成下一个伪随机数。
booleannextBoolean()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的boolean值。
voidnextBytes(byte[]bytes)
生成随机字节并将其置于用户提供的字节数组中。
doublenextDouble()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在0.0和1.0之间均匀分布的double值。
floatnextFloat()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、在0.0和1.0之间均匀分布的float值。
doublenextGaussian()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、呈高斯(“正常地”)分布的double值,其平均值是0.0,标准偏差是1.0。
intnextInt()
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的int值。
intnextInt(intn)
返回一个伪随机数,它是从此随机数生成器的序列中取出的、在0(包括)和指定值(不包括)之间均匀分布的int值。
longnextLong()
返回下一个伪随机数,它是从此随机数生成器的序列中取出的、均匀分布的long值。
voidsetSeed(longseed)
使用单个long种子设置此随机数生成器的种子。
三、Random类使用说明
1、带种子与不带种子的区别
Random类使用的根本是策略分带种子和不带种子的Random的实例。
通俗说,两者的区别是:
带种子的,每次运行生成的结果都是一样的。
不带种子的,每次运行生成的都是随机的,没有规律可言。
2、创建不带种子的Random对象
Randomrandom=newRandom();
3、创建不带种子的Random对象
有两种方法:
1)Randomrandom=newRandom(555L);
2)Randomrandom=newRandom();
random.setSeed(555L);
四、测试
通过一个例子说明上面的用法
importjava.util.Random;
/**
*Java随机数测试
*User:
leizhimin
*Date:
2008-11-1917:
52:
50
*/
publicclassTestRandomNum{
publicstaticvoidmain(String[]args){
randomTest();
testNoSeed();
testSeed1();
testSeed2();
}
publicstaticvoidrandomTest(){
System.out.println("--------------test()--------------");
//返回以毫秒为单位的当前时间。
longr1=System.currentTimeMillis();
//返回带正号的double值,大于或等于0.0,小于1.0。
doubler2=Math.random();
//通过Random类来获取下一个随机的整数
intr3=newRandom().nextInt();
System.out.println("r1="+r1);
System.out.println("r3="+r2);
System.out.println("r2="+r3);
}
publicstaticvoidtestNoSeed(){
System.out.println("--------------testNoSeed()--------------");
//创建不带种子的测试Random对象
Randomrandom=newRandom();
for(inti=0;i<3;i++){
System.out.println(random.nextInt());
}
}
publicstaticvoidtestSeed1(){
System.out.println("--------------testSeed1()--------------");
//创建带种子的测试Random对象
Randomrandom=newRandom(555L);
for(inti=0;i<3;i++){
System.out.println(random.nextInt());
}
}
publicstaticvoidtestSeed2(){
System.out.println("--------------testSeed2()--------------");
//创建带种子的测试Random对象
Randomrandom=newRandom();
random.setSeed(555L);
for(inti=0;i<3;i++){
System.out.println(random.nextInt());
}
}
}
运行结果:
--------------test()--------------
r1=1227108626582
r3=0.5324887850155043
r2=-368083737
--------------testNoSeed()--------------
809503475
1585541532
-645134204
--------------testSeed1()--------------
-1367481220
292886146
-1462441651
--------------testSeed2()--------------
-1367481220
292886146
-1462441651
Processfinishedwithexitcode0通过testSeed1()与testSeed2()方法的结果可以看到,两个打印结果相同,因为他们种子相同,再运行一次,结果还是一样的,这就是带种子随机数的特性。
而不带种子的,每次运行结果都是随机的。
五、综合应用
下面通过最近写的一个随机数工具类来展示用法:
importjava.util.Random;
/**
*随机数、随即字符串工具
*User:
leizhimin
*Date:
2008-11-199:
43:
09
*/
publicclassRandomUtils{
publicstaticfinalStringallChar="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
publicstaticfinalStringletterChar="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
publicstaticfinalStringnumberChar="0123456789";
/**
*返回一个定长的随机字符串(只包含大小写字母、数字)
*
*@paramlength随机字符串长度
*@return随机字符串
*/
publicstaticStringgenerateString(intlength){
StringBuffersb=newStringBuffer();
Randomrandom=newRandom();
for(inti=0;i sb.append(allChar.charAt(random.nextInt(allChar.length())));
}
returnsb.toString();
}
/**
*返回一个定长的随机纯字母字符串(只包含大小写字母)
*
*@paramlength随机字符串长度
*@return随机字符串
*/
publicstaticStringgenerateMixString(intlength){
StringBuffersb=newStringBuffer();
Randomrandom=newRandom();
for(inti=0;i sb.append(allChar.charAt(random.nextInt(letterChar.length())));
}
returnsb.toString();
}
/**
*返回一个定长的随机纯大写字母字符串(只包含大小写字母)
*
*@paramlength随机字符串长度
*@return随机字符串
*/
publicstaticStringgenerateLowerString(intlength){
returngenerateMixString(length).toLowerCase();
}
/**
*返回一个定长的随机纯小写字母字符串(只包含大小写字母)
*
*@paramlength随机字符串长度
*@return随机字符串
*/
publicstaticStringgenerateUpperString(intlength){
returngenerateMixString(length).toUpperCase();
}
/**
*生成一个定长的纯0字符串
*
*@paramlength字符串长度
*@return纯0字符串
*/
publicstaticStringgenerateZeroString(intlength){
StringBuffersb=newStringBuffer();
for(inti=0;i sb.append('0');
}
returnsb.toString();
}
/**
*根据数字生成一个定长的字符串,长度不够前面补0
*
*@paramnum数字
*@paramfixdlenth字符串长度
*@return定长的字符串
*/
publicstaticStringtoFixdLengthString(longnum,intfixdlenth){
StringBuffersb=newStringBuffer();
StringstrNum=String.valueOf(num);
if(fixdlenth-strNum.length()>=0){
sb.append(generateZeroString(fixdlenth-strNum.length()));
}else{
thrownewRuntimeException("将数字"+num+"转化为长度为"+fixdlenth+"的字符串发生异常!
");
}
sb.append(strNum);
returnsb.toString();
}
/**
*根据数字生成一个定长的字符串,长度不够前面补0
*
*@paramnum数字
*@paramfixdlenth字符串长度
*@return定长的字符串
*/
publicstaticStringtoFixdLengthString(intnum,intfixdlenth){
StringBuffersb=newStringBuffer();
StringstrNum=String.valueOf(num);
if(fixdlenth-strNum.length()>=0){
sb.append(generateZeroString(fixdlenth-strNum.length()));
}else{
thrownewRuntimeException("将数字"+num+"转化为长度为"+fixdlenth+"的字符串发生异常!
");
}
sb.append(strNum);
returnsb.toString();
}
publicstaticvoidmain(String[]args){
System.out.println(generateString(15));
System.out.println(generateMixString(15));
System.out.println(generateLowerString(15));
System.out.println(generateUpperString(15));
System.out.println(generateZeroString(15));
System.out.println(toFixdLengthString(123,15));
System.out.println(toFixdLengthString(123L,15));
}
}
运行结果:
vWMBPiNbzfGCpHG
23hyraHdJkKPwMv
tigowetbwkm1nde
BPZ1KNEJPHB115N
000000000000000
000000000000123
000000000000123
Processfinishedwithexitcode0
六、总结
1、随机数很常用,在Java有三种产生方式,以Random随机数的使用最为复杂。
2、Random类对象有是否带种子之分,带种子的只要种子相同,多次运行,生成随机数的结果总是那样。
3、带种子随机数的带种子的对象创建方式有两种,效果一样。
但是带种子的随机数用处似乎不大。
4、Random的功能涵盖了Math.random()的功能。
5、可以通过随机数去做实现随机字符串等复杂的随机数据。
6、不要研究不重复的随机数,意义不大。