77百科网
当前位置: 首页 生活百科

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)

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

    推荐阅读
  • 龙和什么生肖最配(你知道吗)

    生肖龙给人的感觉永远都是勇往直前、乐观积极,整体充满着力量和生机,在做事方面总是起着带头作用天象国学特邀老师冯建国认为属龙的和属鼠最配,今天小编就来聊一聊关于龙和什么生肖最配?天象国学特邀老师冯建国认为属龙的和属鼠最配。而属鼠人显然就比较精明得多了,所以有他们在属龙人的身边,可以帮助属龙人更好的认识自身,在工作上也才能够有更好的进步。

  • 大多数幼师的副业是什么(幼师是教书育人还是杂工)

    为何小初高老师深受家长尊重,为何幼师待遇窘迫,为何幼师教学能力深受争议?每天除了在一日流程里面保证孩子不要受伤之外,还有个最重要的工作就是填表、拍照、写文档。然后就是家长工作,每个老师必须每学期家访多少,需要组织家长去亲子户外积累照片做视频、做公众号,而且很多说是自愿的情况下还是需要劝说家长“必须”。

  • 黄晓明袁泉大上海剧照(曾被嘲没演技的黄晓明)

    但连着混影帝,而且能混出中国首个大满贯,番茄君是不信的。法庭上,她才知道,老公宋嘉辰是因为违规信息披露,串供甚至销毁证据被逮捕的。但背地里,宋嘉辰不仅违反法律,还搞婚内出轨的戏码。随后又拐弯抹角地骂顾念没有经验,靠关系上位。郑瑾没有逃逸,第一时间拨打了120和110,但犯罪事实却已经造成。最新剧情中,丰盛多次出手保护顾念,获得了不少观众的好感。实际上,这归功于黄晓明的演技。

  • 女人一生最值得拥有的香奈儿十大经典包款推荐(女人一生最值得拥有的香奈儿十大经典包款推荐)

    6、GSTGST是Chanel的入门级包包之一,诞生于2010年,全称是“ChanelGrandShoppingTote”,也就是购物袋系列,因其大小适宜,使用方便,大LOGO,价格实惠,成为CHANEL最畅销的手袋系列之一。

  • 花青素常吃有什么好处(5种花青素食物要常吃)

    蓝莓蓝莓营养价值非常高,甚至被称为“黄金浆果”。每100克的蓝莓中含有高达167毫克的花青素,在所有果蔬中算是佼佼者,所以蓝莓也是世界粮食及农业组织推荐的五大健康水果之一。

  • 迷你世界里有哪些必玩的地图(盘点迷你世界中那些有意思的地图之末班地铁)

    《迷你世界》之所以被称之为市面上最好玩的沙盒手游,全都要归功于其丰富的内容玩法,在这款游戏中,玩家几乎可以体验到所有的游戏类型。当主角靠近到一定程度时,鬼怪又突然消失了,只留下独自一人的主角站在空荡荡的车厢里。整个游戏流程玩下来游戏体验很棒,各种恐怖要素都抓得非常的准,不得不佩服作者强大的想象力和《迷你世界》强大的地图编辑能力。

  • 乌鸫会说话视频(乌鸫怎么读)

    乌鸫怎么读1、读音:[wūdōng]。体重55-126克,体长210-296毫米;雄性的乌鸫除了黄色的眼圏和喙外,全身都是黑色。虹膜褐色,鸟喙橙黄色或黄色,脚黑色。海拔高度从数百米到4500米左右均可遇见,是杂食性鸟类,食物包括昆虫、蚯蚓、种子和浆果。分布于欧洲、非洲、亚洲。乌鸫是瑞典国鸟。

  • 沃柑冷藏能存放多久(存放俩月都不腐烂的沃柑你敢吃吗)

    据称,沃柑种植户在采摘沃柑之后会采用咪鲜胺、抑霉唑、百可得及“24滴”等对沃柑进行浸泡处理,只要经过这样的处理,沃柑就能够长期存放了。.咪鲜胺对水生生物有极高的毒性,有可能对水体环境产生长期不良影响,因此,严禁在任何水域中使用。对水生生物急性毒性为高毒,慢性毒性表现为存活率、生殖能力下降。但为了增强这些抑菌农药的抑菌作用,大多数果农并不会严格按照规定来做。

  • 苹果怎么做能减肥(教你做苹果瘦身餐)

    做法:1、将鸡蛋打散,加入鲜奶及糖搅拌。做法:1、将苹果去皮切丁,放入小杯子中。在起锅前20分钟放入锅中,加适量盐即可。