使用随机长来生成随机双打

时间:2016-05-30 15:15:37

标签: java random

我正在实现自己的随机数生成器,我自然使用的算法给了我一个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

1 个答案:

答案 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