我正在实现自己的随机数生成器,我自然使用的算法给了我一个nextLong()
方法。但是,使用此核心方法,我需要以nextLong(long)
的形式实现其他标准方法,例如nextInt()
,nextDouble()
,nextLong()
等。例如:
public long nextLong(long n) {
long bits, val;
do {
bits = (nextLong() << 1) >>> 1;
val = bits % n;
} while (bits - val + n - 1 < 0L);
return val;
}
public int nextInt() {
return (int)nextLong();
}
如何实施nextDouble
?
答案 0 :(得分:3)
不知道自己做的目的是什么,但你可以像内置Random
类为nextDouble()
那样做,就像在javadoc中所描述的那样:
方法
nextDouble
由类Random
实现,如下所示:public double nextDouble() { return (((long)next(26) << 27) + next(27)) / (double)(1L << 53); }
由于您没有int next(int bits)
方法,但确实有nextLong()
方法,因此请使用((long)next(26) << 27) + next(27)
等同于next(53)
的事实。由于next(int)
方法返回int
,即最大值,因此完成了很长时间。 32位。
要从长整数获得53位,您可以使用低位或高位53位,您可以选择:
long low53 = nextLong() & ((1L << 53) - 1);
long high53 = nextLong() >>> (64 - 53);
所以,你的代码是:
private static final double DOUBLE_UNIT = 0x1.0p-53; // 1.0 / (1L << 53)
public double nextDouble() {
return (nextLong() >>> (64 - 53)) * DOUBLE_UNIT;
}
DOUBLE_UNIT
内容是Random
内部实际执行的内容,因为乘法比分割更快,例如见Floating point division vs floating point multiplication。