我正在使用 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/