首页 > 编程知识 正文

产生随机数java,java随机数生成

时间:2023-05-04 21:32:41 阅读:31107 作者:1224

在实际的开发工作中经常需要随机数。 在某些系统上创建用户时,会为用户提供随机初始化密码。 这个密码是随机的,所以经常只有用户知道。 他们获得这个随机密码后,需要立即更改系统。 这就是利用随机数的原理。 总之随机数经常用于日常开发工作中。 根据开发语言的不同,生成随机数的方法和技巧也不同。 这里以Java语言为例,谈谈随机数生成的方法和一些技巧。

使用random方法生成随机数。

用Java语言生成随机数相对简单。 因为有现成的方法。 在Math类中,Java语言提供了一种名为random的方法。 用这种方法可以在系统中产生随机数。 但是,默认情况下,生成的随机数范围是大于或等于0小于1的双精度随机数。 其随机数产生的范围比较小,不能满足日常需要。 日常工作中可能需要生成整数随机数。 实际上,如果对该方法进行灵活处理,则能够取得任意范围的随机数。 例如,可以用random方法生成随机数,然后将结果乘以10。 此时发生的随机数字是0以上且小于10的数字。 然后使用Int方法进行转换。 去掉小数后面的数字。 也就是说,只检索整数部分而不是四舍五入。 最后可以获取0到9之间的整数型随机数字。 其实现方法简单,将现有的random方法以(int () Math.Random ) ) 10 )这样的格式变形即可。 其实也可以扩展这个方法,产生任意范围的随机数。 在必须将此10更改为n之前,请将其更改为((int ) (Math.Random ) ) *n )。 这将使APP应用程序生成介于0和n之间的随机数。 将n设置为5将生成0到5之间的整数类型的随机数。 如果将其写入带参数的方法中,则如果用户输入需要生成随机数的最大值,则可以使该方法生成指定范围的随机数。 在Java中定义自己的工具库

程序员可能需要生成指定范围内的随机偶数或奇数。 这个时候,能用这个方法实现吗? 答案是肯定的。 现在,如果程序需要生成1-100范围内的偶数。 这个时候该怎么实现呢? 首先,必须生成0到99之间的随机数。 这里为什么是99,耐心看看就知道原因了。 要实现这个需求,很简单吧。 I=1(int ) ) Math.Random ) *100 )这样的语句实现。 在这里,int(math.random ) *99 )产生从0到99的整数型随机数。 然后加1生成1到100之间的随机整数。 然后,将生成的随机数代入变量I。 但是,此时产生的随机数有偶数和奇数。 现在程序员需要的是随机偶数。 那么,也可以在后面添加if判断句。 将该随机数除以2,如果没有馀数(或者如果馀数为0 ),则表示该随机数为偶数,直接返回即可。 如果其返回的馀数不是零,就表示是奇数,我们只要加1就变成偶数,返回就可以了。 请注意,在上述随机数生成中,笔者采用的范围为0到99,加上1,为1到100之间的随机数。 这将生成1到100之间的随机偶数。 其实,要使范围随机奇数,只要稍微修改上面的句子就可以了。 Java:将改变你和我的世界

如果现在用户想要生成任意范围的奇数或偶数,可以实现吗? 现在,假设用户想实现m到n之间的任意偶数(

可知random方法自身产生的随机数有比较严格的范围限制。 但是,只要进行适当的转换,程序员就可以用这种方法生成用户所需的随机数据。

在Random类中生成随机数。 在Java语言中,可以使用random方法生成随机数,也可以使用random类生成随机数。 程序开发人员可以通过实例化Random对象来创建随机数生成器。 例如,Random i=new Random ()。 在此语句中,我们使用Random类创建了随机数生成器。 但是,用该方法生成随机数时,与使用Random法产生随机数的结构不同。 以这种方式实例化对象时,Java编译器会将系统的当前时间作为随机数生成器的种子。 因为时间在时刻变化。 假设该时间是生成器的种子,则确保所生成的随机数真的随机,并且所生成的随机数的重复率大幅降低。

利用这个方法很方便。 可以使用提供的关键字将随机整数(如intnextint(10 ) )返回给程序。 但是,其返回控制比Random法稍微困难一些。 如果系统现在需要提供10到50之间的随机奇数,则无法使用此Random类。 也就是说,使用这个Random类生成随机数,它只能控制上限,不能控制下限。 这意味着可以指定最大的随机数范围,但不能指定最小的随机数范围。 因此,在灵活性方面,比Random法稍差。

另外,要用这种方法实现,首先必须创建对象。 也就是说,使用Randow类创建对象。 这和Randow的方法不同。 如上例所示,Randow方法本身是math类的方法,可以直接调用,可以省略创建对象的方法。 因此,我们建议读者和程序开发人员使用Random方法创建随机数。 只有在生成相对特殊的随机数时,才采用Random类。 目前,如果需要生成概率密度为深蓝色百合分布的双精度值随机数,用Random类方法构造随机数比较简单。

生成随机字符。 上面介绍的两种方法都生成随机的数值型数

据。但是有时候用户可能还需要产生随机的字符。其实也可以利用random方法来产生随机字符。如可以利用代码生成一个随机的小写字符:(char)(‘a’+Math.random()*(‘z’-‘a’+1))。其实这跟生成任意两个数之间的随机数类似。通过以上的代码就可以生成一个范围之内的任意随机字符。通过对这个代码进行适当的修整,还可以生成任意两个字符之间的随机字符与任意大写字符的随机字符。其转换的方式跟上面提到的任意范围之内的随机数类似。各位读者若感兴趣的话,可以自己进行测试一下。师傅领进门,修行在自身。如果笔者在这里一股脑儿将所有的答案告诉大家,大家的印象不会很深。大家若回去自己动手试试看,反而更容易记住。

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

进阶

通过阅读Math.random()的源码,或者干脆利用IDE的自动完成功能,开发人员可以很容易发现,java.lang.Math.random()使用一个内部的随机生成对象-一个很强大的对象可以灵活的随机产生:布尔值、所有数字类型,甚至是碧蓝的百合分布。例如:

new java.util.Random().nextInt(10)

它有一个缺点,就是它是一个对象。它的方法必须是通过一个实例来调用,这意味着必须先调用它的构造函数。如果在内存充足的情况下,像上面的表达式是可以接受的;但内存不足时,就会带来问题。

一个简单的解决方案,可以避免每次需要生成一个随机数时创建一个新实例,那就是使用一个静态类。猜你可能想到了java.lang.Math,很好,我们就是改良java.lang.Math的初始化。虽然这个工程量低,但你也要做一些简单的单元测试来确保其不会出错。

假设程序需要生成一个随机数来存储,问题就又来了。比如有时需要操作或保护种子(seed),一个内部数用来存储状态和计算下一个随机数。在这些特殊情况下,共用随机生成对象是不合适的。

并发

在Java EE多线程应用程序的环境中,随机生成实例对象仍然可以被存储在类或其他实现类,作为一个静态属性。幸运的是,java.util.Random是线程安全的,所以不存在多个线程调用会破坏种子(seed)的风险。

另一个值得考虑的是多线程java.lang.ThreadLocal的实例。偷懒的做法是通过Java本身API实现单一实例,当然你也可以确保每一个线程都有自己的一个实例对象。

虽然Java没有提供一个很好的方法来管理java.util.Random的单一实例。但是,期待已久的Java 7提供了一种新的方式来产生随机数:

java.util.concurrent.ThreadLocalRandom.current().nextInt(10)

这个新的API综合了其他两种方法的优点:单一实例/静态访问,就像Math.random()一样灵活。ThreadLocalRandom也比其他任何处理高并发的方法要更快。

经验

qfdny Marasti-Georg指出:

Math.round(Math.random() * 10)

使分布不平衡,例如:0.0-0.499999将四舍五入为0,而0.5至1.499999将四舍五入为1。那么如何使用旧式语法来实现正确的均衡分布,如下:

Math.floor(Math.random() * 11)

幸运的是,如果我们使用java.util.Random或java.util.concurrent.ThreadLocalRandom就不用担心上述问题了。

Java实战项目里面介绍了一些不正确使用java.util.Random API的危害。这个教训告诉我们不要使用:

Math.abs(rnd.nextInt())%n

而使用:

rnd.nextInt(n)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。