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

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)

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

    推荐阅读
  • 雷蛇键盘猎魂光蛛v2竞技版(8000Hz轮询率)

    日前,雷蛇更新了猎魂光蛛V2光轴键盘。雷蛇猎魂光蛛V2光轴机械键盘雷蛇猎魂光蛛V2光轴机械键盘采用了双色注塑PBT键帽,键帽壁为1.5mm加厚设计,内部加强筋也没有缺少,耐用性得到了保障。另外值得一提的是,雷蛇猎魂光蛛V2光轴机械键盘使用了RazerHyperPolling技术,让其按键延迟低至0.2ms,比普通机械轴体快10倍,是一款非常适合游戏的轴体。

  • 微信被永久限制登录怎么办(下面4个步骤帮你解决)

    以下内容大家不妨参考一二希望能帮到您!微信被永久限制登录怎么办首先手机桌面打开“微信”,关注“微信安全中心”公众号。在微信客户端登录界面输入账号密码,轻触“登录”。根据登录弹窗进入解封流程,输入相应的信息即可。

  • 北方的羊绒好还是南方的羊绒好(你知道享誉世界的羊绒从哪儿来吗)

    许多人都不知道,内蒙古鄂尔多斯的羊绒制品不仅在中国很出名,在全球也享有盛誉,据统计全球有三分之一的羊绒都是从鄂尔多斯出口的。由于做工细致,重量轻薄,羊绒被人们称之为衣界中的奢侈品,被人们认为是“纤维宝石”、“纤维皇后”。一只成年的山羊身上,每年仅能获取10至40克的羊绒,而织成一件羊绒衫需要3-5只羊。全球约70%的羊绒都来源于中国内蒙古,品质上也高于其它国家,而鄂尔多斯的羊绒品质更是独占鳌头。

  • 皮蛋用煮吗(皮蛋相关介绍)

    皮蛋相关介绍不需要皮蛋又被称为松花蛋,是我国特有的一种蛋制品,味辛涩、甘、咸,适量食用具有一定泻热、醒酒等作用,对人体的健康具有一定好处一般来说皮蛋买回来之后是不需要煮的,皮蛋本身就是一种加工蛋品,买回家之后是可。

  • 牛奶吐司的做法 牛奶吐司的做法家庭做法

    3、黄油热溶后,加入面粉中,搓揉至面粉能拉开大片不破有弹性的薄膜。

  • 积分兑换的火车票可以改签吗(积分兑换的火车票可以改签吗改天吗)

    积分兑换的车票可以在车站会员服务窗口办理改签,但不办理退票、变更到站。改签范围仍为允许积分兑换的车票,并有相应的积分。改签新票票价高于原票票价时,需使用积分支付差额,新票票价低于原票票价时差额不退。其中最大的坏处就是乘客的行程可能因为临时有事而耽搁。要注意车票改签后,旅客取消旅行的,可以按规定退票,但开车后改签的车票不能退票。

  • 瑞丽翡翠便宜吗(在瑞丽购买翡翠价格很低吗)

    瑞丽翡翠便宜吗还是比较划算的,不过在瑞丽买翡翠,成品的价格并不是特别高,但是有没有假货就不知道了,需要自己做出主意。在云南瑞丽买翡翠并不会便宜,当然自己也可以和商家商量一下价格,最好不要到旅游景区和机场购买。

  • 如果长期熬夜的话会怎么样(经常熬夜的人后来都怎样了)

    但很多行为会加速衰老,特别是熬夜。在休息时间充足和熬夜两种状态下身体的老化速度是不一样的。

  • 梦见上厕所厕所很脏是什么意思(梦见上厕所厕所很脏梦境解析)

    接下来我们就一起去了解一下吧!梦见上厕所厕所很脏是什么意思谈婚论嫁的人梦见上厕所很脏,说明意见不合难成。创业的人梦见上厕所很脏,代表虽然有财利可得,不能疏忽大意,否则损失亦大。怀有身孕的人梦见上厕所很脏,预示生男,八月占生女。准备考试的人梦见上厕所很脏,意味着阻碍多,辛劳,终于录取。打算出门的人梦见上厕所很脏,建议宜待时出外或延到春季为佳。

  • 炼辣椒油的正确方法(辣椒油做法步骤)

    炼辣椒油的正确方法干辣椒和干花椒将买来的花椒干和辣椒干混合在一起,用清水清洗干净并控干,然后打碎它们,再放到盆子里面。烧锅然后烧锅,等锅烧开之后,倒入适量的油,可以是橄榄油或花生油都可以,把油也烧开。倒入辣椒和花椒等热油之后,将花椒干和辣椒干一起放进去搅拌下,也可以将热油倒在干辣椒和干花椒上面,再搅拌均匀即可。佐料如果加上一些佐料,比如八角、香叶等清香的干料的话,会使辣椒油变得更加清香美味。