肥宅钓鱼网
当前位置: 首页 钓鱼百科

java生成有条件的随机数(Java中生成随机数的几种高级用法)

时间:2023-08-15 作者: 小编 阅读量: 1 栏目名: 钓鱼百科

java生成有条件的随机数众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。假设程序需要生成一个随机数来存储,问题就又来了。比如有时需要操作或保护种子,一个内部数用来存储状态和计算下一个随机数。在这些特殊情况下,共用随机生成对象是不合适的。Java实战项目里面介绍了一些不正确使用java.util.RandomAPI的危害。

java生成有条件的随机数?众所周知,随机数是任何一种编程语言最基本的特征之一而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数看似简单,但有时我们也会忽略了一些有趣的功能,今天小编就来说说关于java生成有条件的随机数?下面更多详细答案一起来看看吧!

java生成有条件的随机数

众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。看似简单,但有时我们也会忽略了一些有趣的功能。

简单用法

最明显的,也是直观的方式,在java中生成随机数只要简单的调用:

java.lang.Math.random()

在所有其他语言中,生成随机数就像是使用Math工具类,如abs, pow, floor, sqrt和其他数学函数。大多数人通过书籍、教程和课程来了解这个类。一个简单的例子:从0.0到1.0之间可以生成一个双精度浮点数。那么通过上面的信息,开发人员要产生0.0和10.0之间的双精度浮点数会这样来写:

Math.random() * 10

而产生0和10之间的整数,则会写成:

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

进阶用法

通过阅读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也比其他任何处理高并发的方法要更快。

经验分享

Chris 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)

好了,解写这么多了,希望有助于你实际应用。顺手分享出去吧^_^

    推荐阅读
  • 2j车厘子多大(关于车厘子大小的介绍)

    果径,28-30mm的为JJ,26-28mm为单J,30-32mm为JJJ果径越大等级越高且车厘子的具体等级,可以在进口原箱的标签上找到,今天小编就来聊一聊关于2j车厘子多大?接下来我们就一起去研究一下吧!2j车厘子多大果径,28-30mm的为JJ,26-28mm为单J,30-32mm为JJJ。D属于颜色的划分,有L、R、D三个等级,分别代表着LIGHT浅色、RED红色、BAARK深色,因此确定车厘子的级别要从大小和颜色两个等级入手,车厘子sjd属于车厘子中的上品。

  • 茄子肉盒怎么烧(肉沫茄子盒你这么做)

    By一只老肥猫用料长茄子1个肉沫适量胡萝卜根干香菇朵大蒜2瓣盐适量鸡蛋1个薯粉适量做法步骤1、把茄子洗干净切成厚度约1cm的小块2、把茄子中间掏空3、刚刚掏出来的茄子,萝卜,蒜头,香菇切成丁。拿个盘子底下放一点粉不要粘盘,还是一样装馅,然后两面再拍点粉会结实一点。馅料可以弄稍微干一点容易定型。欢迎在下方留言分享您对这道美食的建议。

  • 属蛇的人适合佩戴什么(属蛇的人适合佩戴什么物品)

    与此同时,石榴石还可以带来好的福气和运气,如此一来,属蛇人在生活中和职场中,便能够遇到很多开心的事情。总之只要多多利用红色元素,属蛇人必然能够催旺运势。当然对于属蛇人而言,想要拥有好的运势和幸福的生活,也要从自己身上做出调整和改变。

  • 2020年2月15日广州宝墨园 广州宝墨园现在开放了吗

    已提前网络预订的游客,可通过原购买门票渠道办理延期或退还票款。给您带来不便,敬请谅解!咨询电话020—84746666,020—84747238。广州番禺宝墨园有限公司2020年2月14日

  • 中央经济工作会议布局加快生猪生产保供稳价

    中央经济工作会议10日至12日在北京举行。今年以来,受“猪周期”下行、非洲猪瘟疫情冲击、地方环保限养等因素叠加影响,中国生猪和能繁母猪存栏浮现较大程度下滑,生猪和猪肉价格大幅度上涨。生猪存栏和能繁母猪存栏这两个重要生产指标双双止降归升,表明全国生猪生产集体趋稳向好。但要注意,不能为了防控非洲猪瘟而压抑生猪生产,同时生猪生产的政策也要尽快落地,让农民没有顾虑。

  • 乐高的山寨货犯法吗(假冒的乐高)

    说起经济犯罪,很多人或许觉得那是高档写字楼里才会发生的案件,离普通老百姓很遥远,而事实上,上海市民安稳有序的日常生活都离不开经侦民警的守护。同样的产品,“乐拼”的价格只有“乐高”的三四成。上海经侦近年来连续组织开展了“亮剑”、“云端”、“春雷”、“利剑”等一系列专项行动,对各类侵犯知识产权犯罪“零容忍”。据统计,从2018年起到今年上半年,上海公安机关共破获了800多起侵犯知识产权案件,涉案金额超过10亿。

  • 离婚男人为什么选择复婚(为什么有些男人离婚后)

    离婚,代表的是两个人从此再没有瓜葛。复婚,不一定是象征发现爱情,而是往后余生,希望彼此继续牵手一起走过的态度。但凡有些生活阅历的人都应该知道,离婚并不是顺理成章的,大概率都会经历各种伤害折磨,甚至对簿公堂的过程。可以说,哪怕女人有想答应的欲望,也会担心对方另有目的,或者是这个关系无法维持长久,再次受到伤害。

  • 铜陵有色铜矿最新消息(紫金矿业拟7792万美元购刚果金铜矿)

    铜陵有色铜矿最新消息紫金矿业周一晚间公告称,11月3日,公司下属全资子公司金城矿业有限公司与浙江华友钴业有限公司签署《股权收购协议》,由金城矿业作为买方,出资7791.67万美元收购华友钴业持有的刚果(金)姆索诺伊矿业简易股份有限公司51%股权及部分股东贷款和部分项目入门费。该项目处于可行性研究和设计阶段,尚未实现商业化生产。2013年及今年上半年该公司亏损763.41万美元和539.09万美元。

  • 龙鱼侧游怎么解决(龙鱼侧泳的解决方法)

    接下来我们就一起去了解一下吧!龙鱼侧游怎么解决龙鱼侧游可以用灯光来调整。补光及灯管摆放:LED的长灯,要把它放在鱼缸里面水面位置,灯管最好是放在拉筋上,只有放拉筋上的灯管才好前后调整位置。这种LED的长灯就24小时开着,晚上可以当小夜灯。如何确定光源不均:晚上关掉室内所有灯光,打开所有龙鱼灯后,人站在鱼缸两侧一眼看过去就会看清光是否均匀了,然后再根据光源来调整灯管位置,尽可能让龙鱼灯照均匀。

  • 2022复旦大学文科分数线(2022年复旦大学高考文理科录取分数线)

    2022年复旦大学高考录取分数线公布,向学霸进军为大家整理2022年复旦大学高考文理科录取分数线。