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

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

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

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)

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

    推荐阅读
  • 短面熊和巨熊区别(一只丑萌的甜饼怪)

    短面熊和巨熊区别越看越丑,越丑越可爱的芝麻街甜饼怪来了。对于喜欢芝麻街的小伙伴来说已经熟悉的不能在熟悉了。甜饼怪超级喜欢吃饼干,天天嘴巴里喊着mewantcookie,他无拘无束,活在当下,有些粗心,有些情绪化。bearbrick与甜饼怪完美的结合,一经推出遍受到追捧,倍受小姐姐、小哥哥们喜爱。价格也是水涨船高,从3XXX一直到7XXX,堪称理财佳品。欢迎喜欢潮玩的小伙伴们多多讨论啊,谢谢大家!

  • leaf怎么读(leaf的意思)

    leaf的意思leaf的读音:英[liːf];美[liːf]leaf,英语单词,名词、及物动词、不及物动词,作名词时意为“叶子;(书籍等的)一张;扇页,人名;(英)利夫”,作及物动词时意为“翻…的页,匆匆翻阅”,作。

  • 木槿花叶子蔫了有救吗(木槿花叶子蔫了怎么办)

    木槿花叶子蔫了有救,做好充足光照、温暖环境、适量施肥、湿润环境等方面的养护措施。当光照比较强烈时候,则就要适当遮阴防止暴晒。冬季则摆放在向阳或有暖气室内。每次施肥时候要做到薄肥勤施原则,不可施加浓肥或者生肥。

  • 清新脱俗文雅好听的女孩名字推荐(高雅好听的女孩名字)

    下面更多详细答案一起来看看吧!清新脱俗文雅好听的女孩名字推荐

  • 可爱的朋友圈小句子(一些可爱至极的朋友圈小句子)

    01可爱之猫必有可爱之处02历尽山河归来仍是粉红小猪03想写一本小狗养成日记缺个小狗,谁愿意来04最近很健忘我是不是得阿尔卑斯症了05悲观者见孔中深渊乐观者见甜甜圈06从今天开始我要变成反派遇见挫折第一反应是哈哈哈事情变得有趣了07刚刚买了根冰棍突然想到我过上了5岁时候的梦想生活天啊!

  • 写打油诗方法(怎么写作打油诗)

    以下内容大家不妨参考一二希望能帮到您!押韵,作为打油诗,我们可以不讲平仄,也不必字字押韵,但所有句子的尾字都尽量去押韵,只有押韵了,句子读起来才郎朗上口,这也是诗歌自古以来惹人喜爱的原因之一。这里有一个简单的方式,就是改写,仿写,那些经典古诗和俗语,这样的打油诗让人读起来不仅郎朗上口,还经常给人一种似曾相识燕归来的错觉。

  • 平安夜送苹果代表什么(平安夜送苹果代表什么寓意)

    据说,“平安果”象征着平安、祥和之意,之所以把“苹果”当成“平安果”的首选,是取了“苹果”的字音。人们把苹果当做平安的代名词,于是平安夜送苹果就成了国人的一种传统,在平安夜收到苹果就表示收到了祝福,来年会过的很好。

  • 厨房是否要做防水(不做后果很可怕)

    厨房用水量大,加上电路分布密集,装修前一定要考虑水管堵塞、爆裂等问题,“严防死守”做好防范。此外,还有特别注意阴阳角。第一遍和第二遍涂刷的方向要相交,以防出现漏刷的情况。若水位没有变化,表示防水质量合格;水位出现变化,及时的查找原因所在并进行修补,之后再次进行闭水试验,直到合格为止。

  • 洗心革面的全新福特金牛座(中东市场的福利)

    也正是由于全新蒙迪欧的存在,金牛座就不得不让路了。可以看到,新车采用了长安福特最新的家族设计语言,全新的点阵式中网格栅,搭配了醒目的分体式大灯组,和全新一代蒙迪欧的造型就更像了。众所周知,长安福特中的蒙迪欧和金牛座均为中型车,典型的资源浪费,鉴于重推蒙迪欧的前提下,现款金牛座或将于今年或2023年正式停产,当然,此前也告别了欧洲和美国市场,因此,新金牛座专供中东汽车市场。

  • 全球最严寒小镇(一个遍地蟑螂却很适合度假的美国城市)

    火奴鲁鲁又名檀香山,总人口大约100万左右,是美国夏威夷的首府也是夏威夷群岛面积最大、人口最多的城市。居住在这里的大多数人是亚裔,其次是夏威夷本地人或来自其他太平洋岛屿的人种。夏威夷的旅游业给当地人提供了很多工作机会,当地人的失业率相当低。然而,火奴鲁鲁的暴力犯罪行为是相当罕见的,防弹衣在这里没有必要随身穿戴。火奴鲁鲁不像美国大陆上的底特律等城市那样经常会发生枪击事件。