`
woxiaoe
  • 浏览: 276537 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

【转载】浅谈在Java中产生随机数的两个很重要窍门

    博客分类:
  • Java
阅读更多

在实际开发工作中经常需要用到随机数。如有些系统中创建用户后会给用户一个随机的初始化密码。笔者这里就以Java语言为例,谈谈Java随机数生成的方法以及一些技巧。
在实际开发打工中经常需求用到随机数。如有些系统中创建用户后会给用户一个的随机的初始化密码。笔者那里就以Java语言为例,谈谈Java随机数生成的窍门以及一些窍门。

     

    一、利用random窍门来生成Java随机数。

    在Java语言中生成Java随机数相对来说较量简单,由于有一个的现成的窍门没成绩应用。在Math类中,Java语言帮助了一个的叫做random的窍门。经过那个窍门没成绩让系统产生随机数。不过默认情况下,其产生的随机数范围较量小,为大于等于0到小于1的double型随机数。虽然其随机数产生的范围较量小,不能够满足日常的需求。如日常打工中估计需求产生整数的随机数。其实,只要对那个窍门停止一些灵活的处理,就没成绩获取任意范围的随机数。

    如咱们没成绩先经过random窍门生成一个的随机数,然后将结果乘以10。此时产生的随机数字即为大于等于0小于10的数字。然后再利用Int窍门停止convert(它会去掉小数掉后面的数字,即只获取整数部份,不是四舍五入)。最后即可获取一个的0到9的整数型随机数字。其出现窍门很简单,那是对原有的random窍门按照如下的格式停止变型:(int)(Math.Random()*10)即可。其实咱们还没成绩对那个窍门停止扩展,让其产生任意范围内的随机数。至需求将那个10换成n即可,如改为(int)(Math.Random()*n)。此时实际运用程序就会产生一个的大于等于0小与n之间的随机数。如将n设置为5,那么其就会产生一个的0到5之间的整数型的随机数。假如将那个写成一个的带参数的窍门,那么只要用户输入需求生成随机数的最大value,就没成绩让那个窍门来生成制定范围的随机数。在Java中定义自己的道具库

    有时间程序员估计需求生成一个的指定范围内的随机偶数或者奇数。此时也许没成绩经过那个窍门来出现呢?正确回答是肯定的。如目前程序要需求生成一个的1-100范围内的偶数。此时该如何出现?首先,需求生成一个的0到99之内的随机数(至于那里为什么是99,耐心看下去就明白理由了)。要出现那个需求,很简单吧,只要经过如下语句就没成绩出现: i=1+(int)(Math.Random()*100)。其中(int)(Math.Random()*99)产生0到99的整数型随机数。然后再加上1那是产生1到100之间的随机整数。然后将产生的随机数赋value给变量i。但是此时其产生的随机数即有偶数,又有奇数。而目前程序员需求的是一个的随机的偶数。那么咱们没成绩在后面加上一个的if判断语句。将那个随机数除以2,假如没有余数的话(或者余数为0)则表明那个随机数是偶数,直接返回即可。假如其返回的余数不为零,那么就表明其是奇数,咱们只要加上1就变为了偶数,返回即可。留意,在上面的随机数生成中,笔者采用的范围是0到99,然后再加上1让其变为1到100的随机数。最后的结果那是生成1到100之间的随机偶数。其实,假如要范围随机奇数的话,至需求对上面的语句停止稍微的改正即可。Java:改变你我的全球

    假设目前用户想生成一个的任意范围内的奇数或者偶数,能够出现吗?假设目前用户想出现一个的m到n之间的任意偶数(其中m

    可见虽然random窍门其自身产生的随机数有较量严格的范围控制。但是只要对其停止符合逻辑的convert,程序员仍然没成绩采用那个窍门产生用户所需求的随机数据。

    二、经过Random类来生成随机数。

    在Java语言中,除了没成绩经过random 窍门来产生随机数之外,还没成绩经过一个的random类来产生随机数。程序开发没成绩经过举例化一个的Random对象来创建一个的随机数的生成器。如Random i=new Random()。经过这条语句就利用了Random类创建了一个的随机数的生成器。不过以这种窍门创建随机数时,与采用Random窍门产生随机数的机制不相同。利用目前这种方法举例化对象时,Java编译器会以系统当前的时间作为随机数生成器的种子。由于时间时时刻刻在变化的。若以那个时间作为生成器的种子,就没成绩保证生成的随机数真的是随机的,其生成的随机数重复率会大大的降低。

    利用这种窍门其较量方便。如没成绩利用帮助的KEYexpress,让程序返回一个的随机的整数(采用int besideInt(10))等等。不过其返回控制要比Random窍门困难一点。如目前需求系统帮助一个的10到50之间的随机奇数, 利用那个Random类就无法完成。也那是说,利用那个Random类来生成随机数,其只能够控制上限,而不能够控制下限。换一句话说,其没成绩指定最大的随机数范围,而不能够指定最小的随机数范围。所以,在灵活性上,其比Random窍门要稍微差一点。

    另外利用那个窍门来出现的话,必需先创建一个的对象。也那是说利用Randow类来创建对象。这跟Randow窍门不相同。像上面举的例子中,Randow窍门本身那是一个的math类中窍门,没成绩直接调用,省去对象创建的窍门。为此笔者意见各位读者与程序开发,最好还是应用Random窍门来创建随机数。只有在生成一些较量特殊的随机数时采用Random类。如目前需求生成一个的概率密度为高斯分布的双精度value随机数时,则经过采用Random类的窍门来创建随机数相对来说较量简单一点。

    三、产生随机的char。

    上面介绍的两种窍门,产生的都是随机的数value型数据。但是有时间用户估计还需求产生随机的char。其实也没成绩利用random窍门来产生随机char。如没成绩利用源代码生成一个的随机的小写char:(char)(‘a’+Math.random()*(‘z’-‘a’+1))。其实这跟生成任意两个数之间的随机数类似。经过以上的源代码就没成绩生成一个的范围之内的任意随机char。经过对那个源代码停止适当的修整,还没成绩生成任意两个char之间的随机char与任意大写char的随机char。其convert的方法跟上面提到的任意范围之内的随机数类似。各位读者若感兴趣的话,没成绩自己停止测试一下。师傅领进门,修行在自身。假如笔者在那里一股脑儿将所有的正确回答告诉,的印相不会很深。若回去自己动手试试看,反而更简易记住。

    笔者在那里给一个的提示,只需求根据m+(int)(Math.Random()*(n-m))这条语句来调整(char)(‘a’+Math.random()*(‘z’-‘a’+1))那个源代码即可。

    最后笔者需求强调的一点那是在用户传入参数的时间,最好要对用户传入的参数停止合法性检查。以免用户传入的参数不符合既定的要求,如参数需求的是数value型的数据而传入的却是char型的数据,而导致程序运行出错。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics