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

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

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

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)

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

    推荐阅读
  • 甜酒酿的营养价值(甜酒酿有什么营养价值)

    我们一起去了解并探讨一下这个问题吧!甜酒酿的营养价值甜酒酿营养价值极高,富含多种维生素C,A,D,碳水化合物,有机酸,蛋白质,矿物质等。能帮助加速血液循环,从而加快新陈代谢。有活血的作用,经期前一周吃有缓解痛经的作用。能促进胃液分泌,增加食欲,帮助消化。

  • 老鼠咬过的面粉还可以吃吗(老鼠咬过的面粉该扔掉吗)

    因为面粉被老鼠啃咬后,会通过老鼠的唾液和体液、皮肤等传染急性的疾病,通过上述渠道经老鼠传播的传染病有好多种,通常有细菌性感染、病毒性感染和寄生虫的感染,例如鼠疫、霍乱等。人吃了会有什么影响。

  • 彩泥宝宝怎么做(教宝宝做彩泥怎么做法)

    彩泥宝宝怎么做?接下来我们就一起去研究一下吧!捏好的橡皮泥更有韧性,多捏一下会更好塑形。注意粗细大致相同。把条状的橡皮泥分成两段。把三分之一的那段捏扁或压扁,待用。捏扁后卷起来,做出玫瑰花的花心。三分之二的那段揪出大小大致相同的几份,搓成圆形待用。

  • 师法自然的下一句(道法自然的一种释义)

    跟着小编一起来看一看吧!师法自然的下一句王中江教授:“道法自然”的真谛是道遵循万物的自然。在宇宙秩序中,“无为”是作为万物根源的“道”的运行方式,道产生了万物但它并不宰控和干涉万物,而是顺从“万物”自行化育,这是“道”的“无为”。“万物”不受外部力量的干涉和强制,按照各自的本性变化,这是万物的“自然”。

  • 陈士铎补血名方(陈士铎头痛分型诊疗)

    陈氏验案可以效法。祛风散邪是其治疗大法。遣方用药,别具一格。内伤头痛肝郁头痛多因情志不畅,肝气郁滞所致,临床多表现为发作性头痛。此病得之郁气不宣,又加风邪袭少阳经,遂致半边头痛。水煎服,无论左右头痛,一剂即止痛,不必多服。发则疼痛难忍,甚则伴有恶心呕吐。陈氏散偏汤确为对症之方。突出表现为周期性发作,且愈发作愈剧烈。陈氏所论,辨证精详,用药丝丝入扣,充分体现了“急则治其标,缓则治其本”的原则。

  • 女生和总裁办公室热恋小说(总裁放着豪宅不住)

    陆晴简直是气疯了,其实她只是一只脚伤了,又不是完全残废,而且她也没有那娇气。陆晴拒绝了他,自己慢慢的走了二步,正准备走第三次的时候,人已经被靳言拦腰起来。陆晴又忍了,她觉得,再跟这个男人在一起的话,忍耐力一定会增强的。看着这个男人翻身到床上的另一边,陆晴大惊,拿着枕头扔了过去。陆晴快疯了,顾不得脚上有伤,扑了过去,掐着他的脖子。陆晴急起来,忘记了自己的脚还伤着,一脚踹了过去。

  • 简单家常菜宝宝能吃(做法超简单宝宝特爱吃)

    我是家樂的忠实粉丝,特别喜欢他们家的产品。能让我在家吃上饭店的高端菜肴。是酸汤黑鱼色彩斑斓,用上海红肠,莴笋,绿色豆芽和青菜点缀。颜值爆表又有食欲黑鱼的营养功效黑鱼性寒、味甘,归脾、胃经;疗五痔,治湿痹,面目浮肿,能够“补心养阴,澄清肾水,行水渗湿,解毒去热”;具有补脾利水,去瘀生新,清热等功效,主治水肿、湿痹、脚气、痔疮、疥癣等症。欢迎在下方留言分享您对这道美食的建议。

  • 成人大专怎么考(成人大专的简介)

    大专成人高考也是比较火的一种学历提升方式,通过成人高考后选择函授或者夜大进行学习,难度一般。每年只有一次报名考试的机会,函授和业余是成人高考的两种学习形式,均是国家承认的学历。在使用上没有区别,函授和业余成人高考都可以用来升学,资格证报考,积分落户。成人大专只有通过国家统一的成人高考考试,才能入学就读。

  • 我家小两口向华强是哪一期 向华强两个儿子

    《我家小两口》向华强在第七期出现,在这一期向华强、向太、郭碧婷、向佐给郭碧婷的爸爸过生日,一家人看起来十分融洽,并且还讨论了郭碧婷和向佐之后的宝宝的名字。

  • 北宋柳永(北宋大词人王观)

    因为这首词作,被高太后认为“夸张了宫廷的奢靡生活,亵渎了皇上宋神宗的形象”,第二天便革除了王观的官职。真实的原因是,高太后对宰相王安石改革变法不满。王观“少负才名,邻里称奇”。由于用情之深之专,流行歌曲出品人王观很快就飙升到业界的金字塔尖,牛到可与婉约派情歌王子秦观并称“二观”程度。虽然王观词的格局并不大。