随机数浅谈Java中的几种随机数

java随机数  时间:2021-02-13  阅读:()

浅谈Jav a中的几种随机数

众所周知随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的产生一个0到1之间的随机数。看似简单但有时我们也会忽略了一些有趣的功能。

我们从书本上学到什么

最明显的也是直观的方式在Java中生成随机数只要简单的调用java. lang.Math.rando m()

在所有其他语言中生成随机数就像是使用Math工具类如abs, pow, f loor

, sqrt和其他数学函数。大多数人通过书籍、教程和课程来了解这个类。一个简单的例子从0.0到1.0之间可以生成一个双精度浮点数。那么通过上面的信息开发人员要产生0.0和10.0之间的双精度浮点数会这样来写

Math.rando m() * 10

而产生0和10之间的整数则会写成

Math.round (Math.rando m() * 10)

进 阶

通过阅读M ath.rando m()的源码或者干脆利用IDE的自动完成功能开发人

员可以很容易发现 java. lang.Math.rando m()使用一个内部的随机生成对象-一个很强大的对象可以灵活的随机产生布尔值、所有数字类型甚至是高斯分布。例如new java.util.Rando m() .nextI nt(10)

它有一个缺点就是它是一个对象。它的方法必须是通过一个实例来调用这意味着必须先调用它的构造函数。如果在内存充足的情况下像上面的表达式是可以接受的但内存不足时就会带来问题。

一个简单的解决方案可以避免每次需要生成一个随机数时创建一个新实例那就是使用一个静态类。猜你可能想到了jav a. lang.Math很好我们就是改 良java .lang.Math的初始化。虽然这个工程量低但你也要做一些简单的单元测试来确保其不会出错。

假设程序需要生成一个随机数来存储 问题就又来了。 比如有时需要操作或保护种子(seed) 一个内部数用来存储状态和计算下一个随机数。在这些特殊情况下共用随机生成对象是不合适的。

并 发

在Java EE多线程应用程序的环境中随机生成实例对象仍然可以被存储在类或其他实现类作为一个静态属性。幸运的是 java.util.Rando m是线程安全的所以不存在多个线程调用会破坏种子(seed)的风险。

另一个值得考虑的是多线程jav a. lang.Threa dLoca l的实例。偷懒的做法是通过Ja va本身A PI实现单一实例 当然你也可以确保每一个线程都有自己的一个实例对象。

虽然Jav a没有提供一个很好的方法来管理java.util.Rando m的单一实例。但是期待已久的Java 7提供了一种新的方式来产生随机数java.util.concu rrent .Threa dLoca lRand om.curre nt() .nextI nt(10)

这个新的A PI综合了其他两种方法的优点单一实例/静态访问就像Math.rando m()一样灵活。 Threa dLoca lRand om也比其他任何处理高并发的方法要更快。

经验

Chris Maras ti-Georg指出:

Math.round (Math.rando m() * 10)

使分布不平衡例如 0.0-0.499999将四舍五入为0而0.5至1.499999将四舍五入为1。那么如何使用旧式语法来实现正确的均衡分布如下

Math.floor (Math.rando m() * 11

幸运的是如果我们使用java .util.Rando m或jav a.util.concu rrent

.Threa dLoca lRand om就不用担心上述问题了。

Java实战项目里面介绍了一些不正确使用java.util.Rando m API的危害。这个教训告诉我们不要使用

Math.abs(rnd.nextI nt() )%n

而使用rnd.nextI nt(n)

ps本文章由北大青鸟广安门校区搜集自互联网

Linode 18周年庆典活动 不断改进产品结构和体验

今天早上相比很多网友和一样收到来自Linode的庆祝18周年的邮件信息。和往年一样,他们会回顾在过去一年中的成绩,以及在未来准备改进的地方。虽然目前Linode商家没有提供以前JP1优化线路的机房,但是人家一直跟随自己的脚步在走,确实在云服务器市场上有自己的立足之地。我们看看过去一年中Linode的成就:第一、承诺投入 100,000 美元来帮助具有社会意识的非营利组织,促进有价值的革新。第二、发...

宝塔面板企业版和专业版618年中活动 永久授权仅1888元+

我们一般的站长或者企业服务器配置WEB环境会用到免费版本的宝塔面板。但是如果我们需要较多的付费插件扩展,或者是有需要企业功能应用的,短期来说我们可能选择按件按月付费的比较好,但是如果我们长期使用的话,有些网友认为选择宝塔面板企业版或者专业版是比较划算的。这样在年中大促618的时候,我们也可以看到宝塔面板也有发布促销活动。企业版年付899元,专业版永久授权1888元起步。对于有需要的网友来说,还是值...

819云互联(800元/月),香港BGP E5 2650 16G,日本 E5 2650 16G

819云互联 在本月发布了一个购买香港,日本独立服务器的活动,相对之前的首月活动性价比更高,最多只能享受1个月的活动 续费价格恢复原价 是有些颇高 这次819云互联与机房是合作伙伴 本次拿到机房 活动7天内购买独立服务器后期的长期续费价格 加大力度 确实来说这次的就可以买年付或者更长时间了…本次是5个机房可供选择,独立服务器最低默认是50M带宽,不限制流量,。官网:https://ww...

java随机数为你推荐
唱吧电脑版官方下载唱吧有没有电脑版的啊?中小企业信息化什么是企业信息化,应该这样实施如何建立一个网站要建立一个网站怎么弄啊?xp系统停止服务XP系统为什么要停止服务?商标注册查询官网如何在网上查询商标是否注册?二层交换机二层交换机是什么意思,三层呢srv记录如何解析一个SRV域名的ip什么是云平台云平台和云计算的区别是什么?发邮件怎么发怎么发邮箱声母是什么22个声母是什么
主机点评 外贸主机 omnis mach 外国域名 150邮箱 电子邮件服务器 有奖调查 七夕快乐英文 域名评估 网站卫士 服务器是干什么的 免费美国空间 百度云1t 天翼云盘 vip域名 114dns 中国联通宽带测速 腾讯数据库 江苏双线 更多