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

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)

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

    推荐阅读
  • 拖欠工资不执行有什么影响(拖欠工资将面临8大惩戒)

    按照最高人民法院司法解释的规定,第一种情形中的“认定拒不支付劳动报酬罪数额标准”由各省高级人民法院根据本地区经济社会发展状况确定具体数额。二是改正之日起至被列入失信惩戒名单满6个月。人社部门在收到申请后15个工作日内进行核实,决定是否予以提前移出。对准予提前移出的,人社部门将及时把当事人移出名单,停止公开相关信息,并发到信用信息共享平台,有关部门按照规定终止联合惩戒措施。

  • 艺名女简单气质洋气(简单气质洋气的女艺名推荐)

    灵雁灵,表示灵巧、灵活。雁,则表示大雁,一种很善于飞翔的鸟,所以寓意着女孩能够实现自己的梦想,能够在事业上有所成就。鹿瑾鹿,是一种动物,同时也是吉祥的象征,作为女孩的艺名能够体现出女生天真可爱的特点。瑾,是美玉的意思。“鹿瑾”这个艺名看上去十分的洋气,也能代表女孩文艺的气质。

  • 关于餐饮浪费的意义(节约粮食的意义)

    以下内容希望对你有帮助!关于餐饮浪费的意义有利于更好维护我们国家的粮食安全。由于餐饮浪费的行为,导致无形中浪费了很多本该得到合理运用的粮食,久而久之,就削弱了我们国家的粮食安全保障能力。有利于节省社会资源。杜绝参与浪费,就可以很好的扭转这一不利局面。总之,杜绝餐饮浪费任重而道远,需要我们人人都积极参与,积极配合,只有这样,才可以真正构建节约型的社会。

  • 发动机怠速与什么有关(什么是发动机怠速问题)

    怠速偏高发动机充分暖机后发动机冷却液高于85℃,且无空调,大灯,音响等负载开启的情况下,发动机转速一直处于高于900转每分钟。怠速偏低发动机充分暖机后发动机冷却液高于85℃,发动机转速一直处于低于600转每分钟,且感觉发动机有明显抖动,转速越低发动机抖的越厉害。

  • 光端机系统容量(光端机的应用案例)

    因为煤矿开采的特殊环境,容易发生事故,煤矿行业也被称为高危险的行业。因此成都讯维远程视频监控系统是现代矿井安全生产监控系统的重要组成部分。报警自动录像还可根据用户需要,设定时间段进行设防。该探头成对使用,一个发射红外光束,一个接收红外光束,当有物体遮断红外光束的发射和接收时将引发探测器报警。警戒区域为点对点的直线形,光束的发射具有专有频率,可防止其他光源的干扰或替代。

  • 九江各区派出所地址一览(九江市九龙派出所地址)

    三里街派出所地址:江西省九江市浔阳区三里街88号星子县公安局东牯山林业派出所西地址:江西省九江市星子县219省道江西省彭泽县公安局东升派出所地址:九江东升乡九江县公安局港口派出所地址:港口街镇江益派出所地址:江西省九江市共青开发区九江市共青城新港派出所地址:江西省九江市庐山区九湖路附近注:以上信息仅供参考,详情请咨询当地公安局派出所

  • 小学生暑假必读的课外书(刚刚出炉的小学生暑假值得阅读的书籍)

    有家长说,孩子平时考试能考90多,一到期末考试就只有80多。语文的仿写句子和看图写话是弱项,数学审题不清。归根结底,就是阅读量太少,词汇积累匮乏,理解能力较弱。所以,增加阅读量,养成阅读习惯是非常重要的。但读书能够增加一些文学常识,能够增长见识,开阔眼界。我认为不能一概而论,如果家长上班忙,把孩子送去托管,总比让孩子自己在家看电视,玩游戏强。每天坚持陪孩子学习十分钟,影响孩子的一生。

  • 护剑一号查手机能查出什么 护剑一号手机检查什么内容

    护剑一号具备快速识别手机中涉赌、涉黄、涉贷等信息。以往手机保密检查中观看网络直播、玩网络游戏、进行网上交友等诸多时常“隐身”的问题,在“护剑一号”面前纷纷原形毕露。

  • 歌颂女性的诗歌艾青(艾青诗选煤的对话)

    艾青的这首散文诗《煤的对话》以对话的方式,一问一答,言简而意深,朴实自然。

  • 利亚纳和利亚纳a6区别(利亚纳和利亚纳a6区别简述)

    利亚纳和利亚纳a6区别底盘相同的两款车,利亚纳和利亚纳a6区别主要是外壳,仪表,轮胎,刹车做了优化,原来a+的样子其实是全球统一的样式,a6的外观只有中国有。作为一款实用型家轿,利亚纳a+最大的变化在于搭载了铃木旗下技术成熟的K14B-GVVT发动机,排量更低,油耗更少,但是动力却依然强劲。利亚纳a+工况油耗为5.6L/百公里,在油价居高不下的今天,可谓是一个非常实惠的选择。