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

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)

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

    推荐阅读
  • 蝙蝠病毒传播哪些疾病(为何会通过蝙蝠传播)

    我们都知道,现代研究认为,病毒也是微生物的一种,在自然界中,微生物可以自身繁衍,属于原始生物,在地球上无处不在。之所以蝙蝠会携带许多病毒,这也是它们进化所付出的代价。当然,蝙蝠虽然毒,但是它们并不会主动传播病毒,反而为了安全考虑,蝙蝠选择了夜行模式,它们在白天都躲起来,而且很多蝙蝠尽可能的远离人群。反而是人类小觑了蝙蝠的威力,自认为自己无所不能,所以,才会让蝙蝠的病毒进入到自己的体内。

  • 王莽岭大瀑布壁纸(有条瀑布会迷人眼)

    (景区金花桥索道与古佛坪索道每周三进行常规检修,索道停运时间为16:00,景区票务停售及禁入时间为13:00,请游客做好提早入园准备。

  • 铁公鸡歇后语是什么(铁公鸡歇后语解释)

    以下内容大家不妨参考一二希望能帮到您!铁公鸡歇后语是什么铁公鸡——一毛不拔。一根汗毛也不肯拔。原指杨朱的极端为我主义。后形容为人非常吝啬自私。叫我们管山吃山,管水吃水,都像你这一毛不拔,我们喝西北风。

  • 璎珞怎么读(璎珞的读音和解释)

    下面内容希望能帮助到你,我们来一起看看吧!璎珞怎么读璎珞,[yīngluò];梵文是keyūra,原为古代印度佛像颈间的一种装饰,由世间众宝所成,寓意为“无量光明”。据《佛所行赞》卷一所载,释迦牟尼当太子时,就是“璎珞庄严身”。另外,璎珞还有美玉的意思。

  • 封潇声为什么这么对柯滢(为什么封潇声这么对柯滢)

    为保护自己和家人,柯滢不得不从,但她并不甘心,一直在找机会自救。为什么封潇声不直接杀柯滢灭口?尽管封潇声后来爱上柯滢,两人之间存在着“虐恋”的关系,但封潇声不杀柯滢绝非因为爱,而是别有目的。封潇声接近柯滢,一开始只为复仇,却从来不打算置她于死地。真正的封潇声,是颇有才华且有上进心的富家公子,可惜身患绝症命不久矣。聪明的柯滢逐渐意识到,或许这才是“封潇声”始终不杀她的真正原因。

  • 看完山村老尸感受(腐尸之屋到底讲了一个什么故事)

    于是Rick再次戴上地狱面具进入死亡世界救出了女友Jennifer。腐尸之屋3第三部游戏中,救回了女友的Rick结了婚,生了儿子David。然而地狱的怪物们并没有打算放过他们,Rick只能再次戴上地狱面具保卫自己的家人。经过重重困难,最终主角战胜了面具,做回了自己。整体来说,《腐尸之屋》并不是一款纯粹讲究血腥、暴力和爽快的游戏。游戏中出现了大量的男主角RICK的内心独白,无时不刻地透露着主角内心的挣扎。

  • 父母恩情的简短句子(感恩父母)

    感恩父母现在越来越多的年轻人,在父母的精心培育下长大,却不知感恩父母,却在怨恨父母为什么把自己带到人间受苦受累,为什么没有象别的父母一样给自己创造更多的财富,让自己冬天住在暖和的屋里,夏天住在凉爽的空调下无忧。

  • 元亨利贞卦象(易经元亨利贞)

    我们经常在典故和卦象上说“元亨利贞”但具体意思还是要分开解读。就比如,在我们老家的婚书上会写“易守乾坤,为元亨利贞,高车驷马,迎亲于渭”我们依靠渭河,为黄河支流。解析“元亨利贞”这便是我们常说的“起因,经过,结果”并且在得到结果之后,保持初心,不忘根本,才能长久。对事情进行分割,把元亨都做到最好,那么得到的利也会最大化,再把贞坚持做好,这样处事为人都会圆滑,左右逢源。

  • 传统手撕鸡的做法(传统手撕鸡的烹饪方法)

    传统手撕鸡的做法主料:鸡半只。辅料:孜然粉1茶匙,食盐4克,生抽3茶匙,姜1小块,蒜4瓣,料酒1茶,匙熟芝麻1/4茶匙。在姜蒜末碗中加入生抽、料酒、孜然粉、食盐搅匀。把鸡放入保鲜袋,倒入调味汁。把袋子口扎紧,360度转动,让调味汁均匀的裹在鸡上,放冰箱腌制4小时左右。腌好后的鸡放入电压力锅,袋子的汁一同倒入,开煮10分钟。

  • 社会心理学方面书籍(社会心理学一本了解自己与社会的绝佳书籍)

    同时作者认为,健康的婚姻并不见得没有冲突,而是夫妻双方能够调和差异,并且他们的情感能够胜过相互的指责。婚姻幸福的心理要素是心意相通、交往和性的亲密、平等地给予和获取情感和物质资源。很多不幸的婚姻,婚前幸福美满,婚后双方过了短暂的甜蜜期回归长期的平淡后,容易矛盾不断,这都是正常现象。如果双方不能继续付出沟通,防止爱情的衰退,婚姻很有可能会慢慢出现裂痕。