【发布时间】:2016-08-31 22:15:31
【问题描述】:
我正在使用生成随机整数的 ISAAC 实现。我需要用这些整数创建一个高斯值。首先,我需要将它们更改为从 0 到 1 的双精度值。我怎样才能在 Java 中做到这一点?到目前为止,这是我将整数转换为双精度的内容,但它仍然需要处于正态分布中。我还使用 java.util.Random.nextGaussian() 逻辑将双精度转换为高斯。
public double nextDouble() {
long l = ((long)(nextInt()) << 32) + nextInt();
return Double.longBitsToDouble(l);
}
最快的方法是什么(cpu 周期)?
【问题讨论】:
-
你的问题不清楚。试着举几个例子。此外,正态分布 mu=0 sigma=1 可能会产生 (-1, 1) 范围之外的值。
-
我会使用 64 位 ISAAC,然后你可以简单地使用
(nextLong() >>> 11) * (1.0 / (1L << 53)) -
另一个问题是您为什么要使用 ISAAC。速度?您的随机数需要具备什么质量?我不会推荐 ISAAC 用于高维科学模拟(更不用说密码学了)。
-
@StefanZobel 这可以与我原始帖子中的“long l”结合起来创建所需的双精度值。请改写为答案,我将奖励。谢谢!
-
当然。但是你有 64 位的 ISAAC 吗?调用 32 位 ISAAC 两次只是为了生成一个 long 是非常低效的。
标签: java random int double gaussian