`
gaoke
  • 浏览: 86845 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jdk7 新特性随机数

    博客分类:
  • 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)
分享到:
评论

相关推荐

    jdk1.8新特性

    ### JDK 1.8新特性详解:Lambda表达式与Java.util.function包 #### Lambda 表达式的引入 在探讨JDK 1.8的新特性时,我们不得不提到Lambda表达式。这一特性极大地简化了Java语言的语法结构,使得编写简洁、易读的...

    jdk17新特性说明和性能方面的提升介绍

    JDK 17是Java开发的一个重要里程碑,它不仅带来了编程语言的新特性和增强,还对性能进行了显著的提升,特别是在垃圾收集(GC)方面。这个版本是自Java 11以来的第一个长期支持(LTS)版本,Oracle承诺提供支持直到...

    jdk-7u71-windows-i586[32位]

    JDK 1.7 的新特性 #### 2.1 增强的多线程支持 - **CountedCompleter Framework**:这是一个用于实现Fork-Join框架的新API,它简化了多线程编程中的任务分解和合并过程。 - **ThreadLocalRandom 类**:为每个线程...

    JDK7 API 帮助文档中文版

    JDK 7引入了一些重要的新特性: 1. **多线程并行流(Parallel Streams)**:在`java.util.stream`包中,新增了并行流,允许开发者利用多核处理器进行并行计算,提高了代码的执行效率。 2. **动态类型语言支持( ...

    最新版windows jdk-14.0.2_windows-x64_bin.zip

    JDK 14.0.2是这个系列的特定版本,它引入了一些新特性和修复了许多已知问题,以提升开发者体验和程序性能。 在Windows上安装JDK 14.0.2,用户需要解压`jdk-14.0.2_windows-x64_bin.zip`文件,其中包含的`jdk-14.0.2...

    Java17新特性详解含示例代码(值得珍藏)

    【Java 17新特性详解含示例代码】 Java 17作为Java的最新版本,引入了一系列提升开发效率、性能和开发体验的新特性。以下是Java 17的主要新特性及其实现方式: 1. **增强的伪随机数生成器 (JEP 356)** Java 17...

    jdk1.8 64位官方正式版 jdk-8u45-linux-x64.tar.gz

    首先,JDK 1.8引入了许多新特性,其中最重要的可能是Lambda表达式。Lambda表达式是一种简洁的编写匿名函数的方式,它允许开发者以更紧凑的形式定义可传递的代码块。这对于简化处理集合和事件驱动编程等场景非常有...

    jdk1.7.0_80

    总结,JDK 1.7.0_80作为Java 7的一个重要版本,其提供的新特性和改进对开发者而言具有很大的价值。无论是在性能优化、代码简洁性还是安全性方面,它都展现出了强大的功能。对于那些仍然依赖Java 7的项目,这个版本的...

    bcprov-jdk15on bcprov-ext-jdk15on 下载

    每个版本都会修复已知问题,添加新特性,或者提高性能。选择特定版本通常是因为应用依赖于该版本的特定功能或者为了保持应用的兼容性。 5. **jar包**:这里的"jar包"指的是Java Archive,是Java平台的一种文件格式...

    jdk-18_macos-x64_bin, Mac jdk-18版本。

    7. **HTTP客户端增强**:JDK内置的HTTP客户端库`http-client`在JDK 18中进行了性能和功能的提升,如支持HTTP/2推送和更好的连接管理。 8. **`Records`类的改进**:这个Java 14引入的特性在JDK 18中得到了扩展,例如...

    jdk17下载与安装教程.docx

    JDK 17提供了丰富的新特性和改进,旨在提升Java应用程序的性能、安全性和可维护性。 二、主要新特性 JEP 306:恢复始终严格的浮点语义:这个特性改进了Java的浮点运算规则,使其在处理浮点数时更加严格和一致。 JEP...

    【最新版】jdk-14.0.1_doc-all.zip【亲测可用】最好的Java JDK14文档

    首先,让我们来看看Java JDK 14的新特性。Java 14是Java SE(标准版)平台的一个主要更新,它引入了一些关键的增强和创新,如: 1. **Records(记录类)**:这是一个新的语法结构,旨在简化数据类的定义,自动处理...

    bouncycastle jar包,版本: jdk15to18-1.73

    随着Java的更新迭代,开发者可能会遇到一些新的特性和API,而这个版本的BC库可能不完全支持,因此在使用时需要考虑兼容性问题。 5. **集成与使用** 在Java项目中,可以通过将bcprov-jdk15to18-1.73.jar和bcprov-...

    JDK api中文版(1.6 和1.7)

    而JDK 1.7则引入了更多的语言特性,如钻石运算符、类型推断、静态导入、try-with-resources语句,以及对JSR 330(依赖注入)的支持。 通过阅读和理解JDK API中文版,开发者能够更好地理解和利用Java提供的各种功能...

    JDK_API 中文帮助文档

    这个版本在2006年发布,引入了许多新特性,例如改进的Swing组件、增强的XML处理、JSR 223脚本引擎支持以及对JDBC 4.0的支持等。API文档详细列出了这些版本中的所有编程元素,使得开发者能够了解如何利用这些新特性...

    jdk1.8 src 源码

    JDK 1.8 是 Java 开发工具包的一个重要版本,它引入了许多新的特性和优化,为开发者提供了更高效、更易用的编程环境。源码是理解任何软件内部工作原理的关键,JDK 1.8 的源码也不例外。通过分析源码,开发者可以深入...

    JDK1.8API英文文档

    通过阅读和理解JDK1.8的API文档,开发者可以深入掌握Java 1.8的新特性和优化,从而编写出更高效、更具可维护性的代码。这份文档不仅是学习的工具,也是日常开发中的实用参考,对于提升Java开发技能至关重要。

    java jdk 13 帮助文档 中英对照版 中文 英文 文档 chm 谷歌翻译

    在JDK 13中,开发者可以找到关于新特性的详细描述,例如: 1. **Switch Expressions (Preview)**:这是继JDK 12之后,Switch语句的进一步扩展,允许使用yield语句返回值,使其更接近函数式编程风格。 2. **Text ...

    jdk文档中文版

    2. **类与对象**: Java是一种面向对象的语言,文档详细阐述了如何定义类、创建对象以及封装、继承和多态等面向对象特性。 3. **包(Package)**: 包是Java中的命名空间,用于组织相关的类和接口。JDK文档列出了标准...

Global site tag (gtag.js) - Google Analytics