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

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、茭白不仅好吃,营养丰富,而且含有碳水化合物、蛋白质、维生素B1、B2、维生素C及多种矿物质。对于剖腹产术后恢复有利。因其性冷,食用前用热水烫温。同时,木瓜自身的营养成分较高,故又称木瓜为乳瓜。产妇产后乳汁稀少或乳汁不下,均可用木瓜与鱼同炖后食用。

  • 少女暗恋学长的言情小说(她暗恋学长许久)

    叶清不知何时走到苏星旁边,轻轻拍了拍她的肩。看着苏星和叶清远去的背影,江远有一种深深的无力感。其实不得不承认,哪怕他自己不愿意,但徐婉儿说的是事实。但这石头对苏星和安小沫两个小矮子就不那么友好了。柯严冲他大喊,试图挽留他。到了营地后,江远放下两大袋吃的。到酒店后,苏星和安小沫住一间,两个女孩都累了,快速收拾了一下便准备睡觉了。内心烦躁,拉起被子盖过头顶,强迫自己入睡。

  • 什么情况房屋不得转租 什么情况房屋不得转租给别人

    为了保护原房东的利益,即使原房东同意转租,出现上述两种情况时,原房东仍可以收回同意房屋转租的意思表示,拒绝同意房屋转租,并按合同约定追究承租人的违约责任。当然,如果原租赁关系当事人之间就拖欠租金和擅自搭建问题达成一致意见,也可以不受上述禁止转租条款的制约,但在违反行政法的情况下除外,例如,当擅自搭建违反房屋规划管理规范时。

  • 植物大战僵尸怎样获得大量金币(植物大战僵尸如何快速获得金币)

    并且平时打僵尸的时候也会随机掉落一些植物,这些掉落的植物更值钱,一个成熟的可以卖八千多。别看只有18关,但是到了最后也是有着18000的金币的。这么多的钱已经足够把戴夫商店里的货物洗劫一空了,所以大家一定要行动起来,把这个给钻石的关卡都利用起来。

  • 手抄报长边框简笔画可爱卡通手绘(各种手抄报卡通小人的画法)

    下面更多详细答案一起来看看吧!手抄报长边框简笔画可爱卡通手绘

  • 重生的古代言情完结小说推荐(今日推荐古代言情)

    一朝重生,虞兮决心远离纷争,永不嫁人,不料前世被她退婚的未婚夫却缠了上来。更是扬言,家里不养母老虎,娶妻不娶赵久久!阿娇着华服,点绛唇,于万人之中,娇滴滴,娇滴滴地向未来新帝抛了个媚眼。容辞又重生了,重生在了十五年前成亲的那一天。到最后,她还被设计送给以残暴闻名的七皇子,落得个悲惨下场。传闻六皇子生而不足,体弱多病,冷情冷性,最终惹恼了皇帝,失了宠爱,被打发出了京城。

  • 网易丁磊创业历史(网易创始人丁磊的不为人知的秘密)

    2000年6月,网易公司在纳斯达克正式挂牌上市。到了9月,想卖也卖不掉了,网易因涉嫌财务欺诈,停牌长达4个月。事实证明,尽管网络游戏市场竞争激烈,网易的投入还是获得了很好的回报。2002年1月1日凌晨,美国纳斯达克股票交易市场管理委员会发布消息称,纳斯达克计划于2002年1月2日上午10点恢复网易公司的股票交易。现在看来,停牌事件是网易业务的转折点。财富的聚集是整个社会关注的焦点。

  • 麦地常见的野菜(麦田里的这个野菜)

    麦地常见的野菜曾经以为麦蒿只是麦田里的杂草,没想到麦蒿更是一种美味的野菜,更是一味治病的天然良药!麦蒿,学名播娘蒿,是农民深恶痛绝的一种野草,生命力非常旺盛。麦蒿农历二月二前后,荠菜尚属枯黄,独有麦蒿生意盎然,嫩绿淡黄,秀色可餐,正是采集食用之最佳时期。麦蒿包子麦蒿同面条菜一样,是农村麦田里的恶性杂草,不少农民想尽千方百计予以清除。

  • 女人梦到被猫咬手出血什么意思(女人梦到被猫咬手出血的寓意)

    以下内容希望对你有帮助!女人梦到被猫咬手出血什么意思做生意的女人梦见手被猫咬出血,代表行情价涨,利小,先损后得,从新整顿营业。女人梦到被猫咬手出血,人际关系良好,心情愉悦的一天。为了提高别人对你注目的机率,在衣着的小细节重点装扮,效果比穿得花花绿绿要好得多。女人梦到被猫咬手出血,吞吞吐吐的样子让感情难以进展,迂回婉转的表现方式似乎无法让对方理解。你需要更直接坦白的表达出心中的想法。

  • 为什么点进拍照功能会黑屏(拍照就黑屏)

    如果手机配置低,要运行过大的软件这样很容易导致死机。