Java随机数总结.docx

上传人:b****3 文档编号:12659762 上传时间:2023-04-21 格式:DOCX 页数:11 大小:17.38KB
下载 相关 举报
Java随机数总结.docx_第1页
第1页 / 共11页
Java随机数总结.docx_第2页
第2页 / 共11页
Java随机数总结.docx_第3页
第3页 / 共11页
Java随机数总结.docx_第4页
第4页 / 共11页
Java随机数总结.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Java随机数总结.docx

《Java随机数总结.docx》由会员分享,可在线阅读,更多相关《Java随机数总结.docx(11页珍藏版)》请在冰豆网上搜索。

Java随机数总结.docx

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、不要研究不重复的随机数,意义不大。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 信息与通信

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1