问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

浅谈Java中的几种随机数

发布网友 发布时间:2022-04-24 01:10

我来回答

2个回答

热心网友 时间:2022-04-12 00:39

众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个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)
英文出自:summa-tech

译文出自:oschina追答各种浅谈

亲,记得采纳哦

热心网友 时间:2022-04-12 01:57

java.util.math.random()
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
挖掘机上的字母标志是什么牌子的挖机 中国市场上挖掘机那国技术占优 微信个人标签经典短句最精辟的微信个性签名 肚子总是不消化,吃完东西不想上厕所。涨涨的 最近老是肚子疼,但疼一会儿就不疼了,就是不想上厕所,有时候五六天都没... ...但是不疼几乎每天早上都会不舒服,也不想上厕所,就是弄的你睡不着觉... 我的肚子老疼,但不是很想上厕所,最近有点拉肚子,可是一吃凉的东西肚子... 因为节目结缘却最终分开,姚沐希彭措的分手,暗示了娱乐圈什么问题? x79支持什么显卡 四叶草是不是三叶草? 请问java中如何生成1000~10000之间的随机数? 关于Java里产生1-6随机数的方法 java生成随机数 Java中怎样产生随机数和随机字母 在java中怎样自定义一个随机数? java如何产生1-8的整数随机数? java随机数指定的范围怎么做 java 取范围内的随机数,比如取10000至99999 java怎么设置随机数 java设置随机数详细教程 在java中产生随机数 Java如何实现随机数? Java怎么产生随机数? 如何在java中产生随机数? Java产生随机数的几种方式 java如何生成随机数? 谁能告诉我貔貅能不能放在厕所里??紧急情况需要会看风水的朋友!! 叫熟人帮忙在寺庙里请貔貅可以吗。 今天大师叫我把貔貅送走,说我请的貔貅不好 熊猫的古称是叫貔貅么? 南京叫貔貅为什么 java生成7个不同的随机数 java中如何产生64位随机数 什么是电子商务师? 电子商务师有几个等级? 电子商务师师干什么的? 电子商务师是干什么的? 电子商务师的有哪几个等级?证书是怎么考的? 中国电子商务师有几个等级? u盘在某一台电脑上读不出来 ps要把一个人很真实的p进一个背景里面去,要做什么处理? 怎样用美图秀秀将一个人ps上去一个背景里? PS里 怎样把一张照片里的人弄到另一背景里? 怎么把人完美的p到背景上去 要哭却哭不出来为什么? 为什么有时候有一种想哭,哭不出来的感觉? 为什么眼泪变少了,想哭也哭不出来? Z5的电话手表可以支付么? 为什么有时候会莫名哀愁?想哭却哭不出来 小天才z5绑定支付宝为什么只能收款不能付款 不知道为什,我总是想哭,可又哭不出来!哎,心里有些难受