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

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)

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

    推荐阅读
  • 风雨过后见彩虹是什么意思(风雨过后见彩虹的意思)

    跟着小编一起来看一看吧!风雨过后见彩虹是什么意思意思是经历了艰难困苦以后,好日子到来了,也就是苦尽甘来。一个真正有成就的人,也肯定是在无数次的跌倒后重新站起来的才取得的成功这句话的表面意思描写的是个自然现象,夏天狂风大雨过后,初晴之时,天空中会出现绚烂的彩虹。现在可以用来鼓励人们不要畏惧困难,当克服苦难就会取得成功。

  • 小叶紫檀金星为啥掉了(小叶紫檀金星为什么会脱落)

    有一种说法就是认为真正的金星是不会掉的,而假金星则是会掉。真正金星不易脱落的情况如下1、真正的金星只有在保养好的条件下,正常的佩戴或者把玩是不会导致或者不容易掉金星的。所以,不管是真假金星小叶紫檀,都有容易脱落和不容易脱落的情况,购买小叶紫檀,最重要的还是小叶紫檀的材质本身。

  • 芦荟怎么用才能美容养颜(芦荟美容养颜好处多)

    芦荟这种植物大家都不陌生,除了具有很强的观赏性外,还能够美容养颜治烫伤但是,却有很多花友认为芦荟很娇气,容易烂根这样操作,不仅好养还能轻松爆盆,我来为大家讲解一下关于芦荟怎么用才能美容养颜?但是,却有很多花友认为芦荟很娇气,容易烂根。这个时候好多花友就会认为芦荟是缺水了,使劲的浇水。避免化学成分进去芦荟植株,间接导致皮肤过敏。其实沙也是很不错的选择,是性价比最高的种植物。

  • 携带资金怎么出国留学(200万是否可以出国留学)

    村西边老王说:“不用平衡,大部分时间学计算机。没有空就不用看哲学、经济学。谁建议你的?。”

  • 身体虚弱如何调理才好(如何调理身体虚弱)

    这类人应该多补益肾气,益精髓,强筋骨,可以选择熟地、五味子、山萸肉、菟丝子、杜仲、肉松蓉等补肾壮阳,也可以选择一些丸剂如肾气丸、地黄丸等对症下药。这时应该补益肺气,汤水可以适当加入黄芪、防风、五味子、人参等,益气补肺。这类人应该气血双补,可以尝试食疗的方法去调理,适当加入补气血的药材,这样才能见效最快。

  • 盘点几部很火的电视剧(最近很火的7部电视剧一定要看)

    最近很火的7部电视剧一定要看有你家CP吗?#电视剧#​#超级好看电视剧#​,。

  • 轻微交通事故逃逸算犯罪吗(轻微交通事故逃逸有什么处罚)

    #普法课堂#【轻微交通事故逃逸有什么处罚?】驾车在道路上发生交通事故,正确处理方式应当是,造成人身伤亡的,驾驶人应当立即抢救受伤人员,并迅速报警。如果只是车损事故,可以即行撤离现场,自行协商解决或到交通事故快速处理中心进行处理。道理虽然很简单,但仍有个别驾驶人在发生事故后不能正确面对,选择逃逸来躲避赔偿责任,孰不知这样的行为后果将是十分严重的。戳进来,告诉你!

  • 无接触式胃镜检查后续(云南患者有了新选择)

    供图据悉,省一院消化内科开展小肠胶囊内镜检查已15年,积累了丰富的经验,在此基础上已成功开展磁控胶囊胃镜检查2年有余。目前麻醉胃镜可以让患者减轻痛苦,但是需要承担麻醉风险,在儿童、老年患者及有心脑肺疾患的人群中使用受到限制。通常情况下,吞服的胶囊三天内会随大便排出体外。

  • 迷你世界的所有传送门都做出来了(隐藏在土山中的通道)

    隐藏在土山中的通道哈喽,小伙伴们大家好在迷你世界的解密中,我们需要找到秘密通道或钥匙才能通关成功清水今天给大家分享的就是如何打造一条秘密通道,学会后不仅做解密地图可以用到,在生存中还可以打造一个属于自己的秘密家园建造隐。

  • 胡萝卜木耳烫面蒸饺 胡萝卜木耳烫面蒸饺好吃吗

    1、主料:500g胡萝卜,150g木耳,500g面粉,250g鸡蛋,配料:适量油,适量盐,适量味精,适量香油。