众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个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)
发表评论
-
js判断一个图片是否已经存在于缓存
2013-05-31 15:15 7253【解决】js判断一个图片是否已经存在于缓存(兼容IE各版本及 ... -
java 加密解密算法总结(转)
2013-03-19 11:28 844package tianya.cn.main; im ... -
深入了解Struts2返回JSON数据的原理及具体应用范例
2013-03-18 09:40 1205转载自: http://yshjava.iteye.com/ ... -
ICE:slice语言常识整理
2013-01-28 10:53 1767============================== ... -
ICE实例
2013-01-25 17:46 887本文将结合实际项目,做一个基于ice的实际项目实例应用,该实例 ... -
ICE转摘学习
2013-01-25 17:44 802Ice 出自ZeroC名门之 ... -
Google 浏览器css hack 写法
2013-01-16 11:09 758针对Chrome和Safari等Webkit核心浏览器的CS ... -
图片预加载做法
2012-12-18 17:34 808/** * 图片头数据加载就 ... -
js 事件冒泡
2012-11-19 14:40 894JavaScript事件冒泡简介及应用 一、什么是事 ... -
ant 常用命令
2012-11-12 22:03 1370C:\>ant -help\-h 获取ant的帮助信息( ... -
java 访问url获取别人的接口服务
2012-08-09 21:51 0** * 程序中访问http数据接口 ... -
Java IO系统之IO系统类层次关系
2012-08-08 09:13 0流是字节序列的抽象概念。 文件是数据的静态存储形式,而流 ... -
java缓存
2012-08-06 12:47 0JAVA缓存技术 JavaJNICacheL ... -
图片滚动带滚动条
2012-07-25 00:08 835<!DOCTYPE html PUBLIC " ... -
Web.xml文件配置
2012-06-12 23:56 771一个简单的web文件配置参考 <?xml versio ... -
java getResource()和getResourceAsStream以及路径问题(转)
2012-06-12 23:54 860用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还 ... -
MYSQL常用命令
2012-05-27 18:10 754MYSQL常用命令 1.导出整个数据库 mysqldump ... -
hibernate 使用二级缓存 配置
2012-05-26 23:57 1014配置二级缓存主要有两个步骤。 选择需要使用第三方二级缓存 ... -
spring新的jar包名称,搭建框架列表
2012-04-28 13:12 914For a typical web application y ... -
图片垂直对齐的方法
2012-04-28 11:39 823<!DOCTYPE html PUBLIC " ...
相关推荐
本文将深入探讨Java中生成随机数的几种方法及其特点。 首先,最基本的随机数生成方法是使用`java.lang.Math.random()`。这个静态方法返回一个介于0.0(包括)到1.0(不包括)之间的双精度浮点数。要生成指定范围内...
在Java编程中,生成随机数是一项常见的任务,用于模拟、测试和各种算法中。本文将深入探讨Java中生成随机数的多种方法,并分析它们的适用场景和潜在问题。 首先,最基础的随机数生成方法是使用`java.lang.Math....
本文将详细探讨Java中生成随机数的几种实现方式,包括基础的Math.random方法以及更高级的并发实现。 首先,最基本的随机数生成方式是通过`Math.random()`方法。这个方法返回一个0.0到1.0之间的双精度浮点数,包含...
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!