Java 17 随机数生成器来了一波稳稳的增强

目录

Java 17 更新更快的 LTS 节奏
Java 17 更新后的 strictfp 关键字

这一条更新来自: JEP 356: Enhanced Pseudo-Random Number Generators ,相比之下,这一条实用多了。

我们都用过随机数,不过一般情况下我们很少去认真的对待随机数的具体结果,就好像它是真的随机一样。

var random = new Random(System.currentTimeMillis());
for (int i = 0; i < 10; i++) {
    System.out.println(random.nextInt());
}

除了 Random 类,JDK 当中还提供了另外几个随机数的成员:

  • ThreadLocalRandom:顾名思义,提供线程间独立的随机序列。它只有一个实例,多个线程用到这个实例,也会在线程内部各自更新状态。它同时也是 Random 的子类,不过它几乎把所有 Random 的方法又实现了一遍。
  • SplittableRandom:非线程安全,但可以 fork 的随机序列实现,适用于拆分子任务的场景。

ThreadLocalRandom 继承自 Random,而 SplittableRandom 与它俩则没什么实际的关系,因此如果我们在代码当中想要动态切换 Random SplittableRandom 就只能定义两个成员,并且在用到的地方做判断:

Java 16

SplittableRandom splittableRandom = ...;
Random random = ...;

boolean useSplittableRandom = false;

...

if (useSplittableRandom) {
   nextInt = splittableRandom.nextInt();
} else {
    nextInt = random.nextInt();
}

而且如果想要自己扩展随机数的算法,也只能自己去实现,原有的定义方式缺乏一个统一的接口。

Java 17 为了解决这个问题,定义了几个接口:

这样我们就可以面向接口编程啦~

另外,尽管各个实现的细节不太一样,但思路基本上一致,因此老版本当中的几个随机数的类当中存在大量重复或者相似的代码。连 JDK 都存在 CV 代码的情况,那我们为了快速实现需求 CV 代码也不丢人,对不。

Java 17 把这些高度相似的逻辑抽了出来,搞了一个新的类:RandomSupport,又一个 3000 行的 Java 文件。

所以以前:

**Java 16 **

// Random.java
public DoubleStream doubles() {
    return StreamSupport.doubleStream
        (new RandomDoublesSpliterator
         (this, 0L, Long.MAX_VALUE, Double.MAX_VALUE, 0.0),
         false);
}

// SplittableRandom.java
public DoubleStream doubles(long streamSize, double randomNumberOrigin,
                            double randomNumberBound) {
    if (streamSize < 0L)
        throw new IllegalArgumentException(BAD_SIZE);
    if (!(randomNumberOrigin < randomNumberBound))
        throw new IllegalArgumentException(BAD_RANGE);
    return StreamSupport.doubleStream
        (new RandomDoublesSpliterator
         (this, 0L, streamSize, randomNumberOrigin, randomNumberBound),
         false);
}

有相似的地方吧。我们再来看看 Java 17 的实现:

Java 17

// Random.java
public DoubleStream doubles() {
    return AbstractSpliteratorGenerator.doubles(this);
}

//SplittableRandom.java
private AbstractSplittableGeneratorProxy proxy;
...
public DoubleStream doubles() {
    return proxy.doubles();
}
...
private class AbstractSplittableGeneratorProxy extends AbstractSplittableGenerator {
    @Override
    public int nextInt() {
        return SplittableRandom.this.nextInt();
    }

    @Override
    public long nextLong() {
        return SplittableRandom.this.nextLong();
    }

    @Override
    public java.util.SplittableRandom split(SplittableGenerator source) {
        return new SplittableRandom(source.nextLong(), mixGamma(source.nextLong()));
    }
}

而这个 AbstractSplittableGenerator 就定义在 RandomSupport.java 当中,是 RandomSupport 一个内部类。

你以为这就没了?不是的。提案的说明当中提到,提案的目标不是实现很多的随机数产生算法,不过这次还是添加了一些常见的实现,所以你会在 JDK 17 当中看到多了一个模块:

这些实现都有自己的名字,用注解标注出来,例如:

@RandomGeneratorProperties(
        name = "L32X64MixRandom",
        group = "LXM",
        i = 64, j = 1, k = 32,
        equidistribution = 1
)
public final class L32X64MixRandom extends AbstractSplittableWithBrineGenerator { ... }

我们可以通过名字来获取它们的实例:

var random = RandomGenerator.of("L32X64MixRandom");
for (int i = 0; i < 10; i++) {
    System.out.println(random.nextInt());
}

到此这篇关于Java 17 随机数生成器来了一波稳稳的增强的文章就介绍到这了,更多相关Java 17 随机数生成器的增强内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java高并发情况下高效的随机数生成器

    前言 在代码中生成随机数,是一个非常常用的功能,并且JDK已经提供了一个现成的Random类来实现它,并且Random类是线程安全的. 下面是Random.next()生成一个随机整数的实现: protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend)

  • Java 17 更新后的 strictfp 关键字

    目录 strictfp 可能是最没有存在感的关键字了,很多人写了多年 Java 甚至都不知道它的存在.接下来,它也没有必要继续存在了. 上一篇文章Java 17 更快的 LTS 节奏 我们今天聊的内容来自于 JEP 306: Restore Always-Strict Floating-Point Semantics.看到这个提案的标题的时候,我就知道很多人懵了.这玩意历史感太强了,说实话我也没怎么接触过. Java 17 刚发布的那天 Kotlin 的群里短暂地提到了这一条,结果大家都以为是这

  • Java 17 更快的 LTS 节奏

    目录 Java 17 更新了,作为一个 10 年的 Java 程序员,还是有亿点点兴奋的,Kotlin 的群里面也是各种讨论 Java 的新特性. 我记得五六年前,谈论起当时刚刚进入人们视野不久的 Java 8,大家还是一副"我们公司还在用 Java 6" 的表情,现在想想 RetroLambda 都已经是很久远的事儿了: 现在的 Java 8 可能大概相当于那时候的 Java 6,在使用上已经非常普遍了,甚至已经有一点儿过时:就连 Android 最近也开始从最新的 Android

  • java实现随机数生成器

    本文实例为大家分享了java实现随机数生成器的具体代码,供大家参考,具体内容如下 自己编的随机数生成器,比较简陋,功能也单一,当作练手. Application.java package src; public class Application { public static void main(String[] args) { WindowBoxLayout win=new WindowBoxLayout(); win.setBounds(100,200,300,350); win.setT

  • Java 17 随机数生成器来了一波稳稳的增强

    目录 Java 17 更新更快的 LTS 节奏 Java 17 更新后的 strictfp 关键字 这一条更新来自: JEP 356: Enhanced Pseudo-Random Number Generators ,相比之下,这一条实用多了. 我们都用过随机数,不过一般情况下我们很少去认真的对待随机数的具体结果,就好像它是真的随机一样. var random = new Random(System.currentTimeMillis()); for (int i = 0; i < 10; i

  • java生成随机数的常用方法分析

    本文实例讲述了java生成随机数的常用方法.分享给大家供大家参考,具体如下: 前因: 经常性的,测试一些功能时都需要造一些假数据,每次都上网来查一下怎么生成随机数.这回我把查到的方法自己整理一下,下次在用不用到处找了. 生成随机数的几种方法: 1. 使用Math.random()生成随机数 直接贴几个小方法 /** * 获取0.0-1.0之间的随机小数 */ private double test1() { double num = Math.random(); return num; } /*

  • Java获取随机数的3种方法

    主要介绍了Java获取随机数的3种方法,主要利用random()函数来实现 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1))例: (int)(1+Math.random()*(10-1+1)) 从1到10的int型随数 方法2 获得随机数 for (int i=0;i<30;i++) {System.out.println((int)(1+Math.random()*10));} (int)(1+Math.random()*10) 通过java.Math包的ra

  • Java 17的一些新特性介绍

    目录 前言 Java 17中的Sealed 密封类 Java 17提供了更好的随机生成器 Java对增强安全性的关注 Pattern Matching For Switch预览 前言 Java17将是一个长期支持的LTS版本. Java采用了6个月的发布周期.也就是说,它将每6个月发布一个新版本的Java.每隔3年,LTS版本就会发布一次.目前,Java 11是LTS版本,于2018年9月发布.但在Java17发布后,它将是最新的LTS支持. 许多组织依赖LTS版本,所以他们使用的是Java11

  • java生成随机数(字符串)示例分享

    用来生成简单的随机java生成随机数,大小+数字.没特符 复制代码 代码如下: package passwords;import java.util.Random;public class pwdGen { private Random rdseed=new Random(); /**  *@param  *length  password length;  *@param  *letters  boolean non-capital letters combination control; 

  • Java中随机数的产生方式与原理详解

    Java中随机数的产生方式与原理 查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以100,他就是个100以内的随机数字,这个在j2me中没有. 在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以生产随机整数.随机float.随机double.随机long,这个也是我们在j2me

  • JavaScript实现随机数生成器(去重)

    本文实例为大家分享了js实现随机数生成器的具体代码,供大家参考,具体内容如下 1.实验前准备: Math函数的理解 数组方法的理解 2.实验操作: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>随机数生成</title> </head> <style type="text/c

  • JAVA递归与非递归实现斐波那契数列

    斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起

随机推荐