Java将两个整数从1到0转换为 double 型

标签 java random int double gaussian

我正在使用 ISAAC 实现来生成随机整数。我需要用这些整数创建一个高斯值。首先,我需要将它们从 0 更改为 1 的 double 值。我怎样才能在Java中做到这一点?这是到目前为止我将整数转换为 double 的内容,但它仍然需要处于正态分布中。我还使用 java.util.Random.nextGaussian() 逻辑将 double 转换为高斯。

public double nextDouble() {
    long l = ((long)(nextInt()) << 32) + nextInt();
    return Double.longBitsToDouble(l);
}

最快的方法是什么(CPU周期方面)来做到这一点?

最佳答案

如果您想无论如何使用 ISAAC,请使用 64 位版本,该版本为您提供 nextLong() 作为原语。生成一个 double 值就很简单了

protected static final double DOUBLE_NORM = 1.0 / (1L << 53);

public double nextDouble() {
    return (nextLong() >>> 11) * DOUBLE_NORM;
}

从那里您可以继续使用 Marsaglia 的极坐标方法作为 nextGaussian() 方法,与 java.util.Random 中的操作方式相同

编辑:几年前我测试过 32 位和 64 位 ISAAC。当然,我不记得确切的数字,但如果您确实需要 64 个随机位,您可能会惊讶地发现 64 位版本可以获得多得多的吞吐量。

编辑 2:如果您还需要整数的 32 个随机位,那么您当然会在 64 位算法上浪费大量工作(这里 32 位肯定更快)。在我的工作中,我主要需要 double ,因此 64 位是最佳选择(对我来说)。

编辑 3:nextFloat() 将是

protected static final float FLOAT_NORM = 1.0F / (1 << 24);

public float nextFloat() {
    return (nextLong() >>> 40) * FLOAT_NORM;
}

关于Java将两个整数从1到0转换为 double 型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259824/

相关文章:

swift - 数组洗牌(使用 : RandomNumberGenerator) strange behavior

java - 需要 int 但有问题并发现零字节

php - MySQL - 将 INT 转换为 DATE 格式。

c - 如何将字符串转换为整数类型

java - 如何从数组列表中删除多余的空格

java - @Configuration 类的 bean 是否始终为 null?

dart - dart 中的嵌套循环和内存不足

java - 如何修复这个(大概)与编码相关的错误(Java、Gradle)?

java - 如何在JETTY服务器上部署war文件

haskell - 生成范围内随机整数的唯一列表