gpt4 book ai didi

java - 为什么允许保留 nextLong() 的底部字有符号?

转载 作者:行者123 更新时间:2023-12-02 10:48:41 26 4
gpt4 key购买 nike

java.util.Random 类有一个方法 nextLong(),它自己调用 next(32) 返回一个随机有符号整数。

public long nextLong() {
// it's okay that the bottom word remains signed.
return ((long)(next(32)) << 32) + next(32);
}

为什么保留底部单词的签名不会影响随机生成的数字的质量?构建示例时,如果底部字为负,则生成的 long 值中间的位将被清零。

final long INTEGER_MASK = 0xFFFFFFFFL;

int upper = Integer.MAX_VALUE;
int bottom = -1;

System.out.printf("%14s %64s%n","Upper:",Long.toBinaryString(((long)upper << 32)));
System.out.printf("%14s %64s%n","Lower:",Long.toBinaryString((long)bottom));

System.out.printf("%14s %64s%n"," Lower Masked:",Long.toBinaryString(((long)bottom)& INTEGER_MASK));

long result = ((long)upper << 32) + bottom;
System.out.printf("%14s %64s%n","Result:",Long.toBinaryString(result));

//Proper
long resultMasked = ((long)upper << 32) + (((long)bottom & INTEGER_MASK));
System.out.printf("%14s %64s%n%n","Masked",Long.toBinaryString(resultMasked));


Upper: 111_1111_1111_1111_1111_1111_1111_1111_0000_0000_0000_0000_0000_0000_0000_0000
Lower: 1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111
Lower Mask: 1111_1111_1111_1111_1111_1111_1111_1111
Result: 111_1111_1111_1111_1111_1111_1111_1110_1111_1111_1111_1111_1111_1111_1111_1111
Masked 111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111

目前低位字贡献 33 位,而高位字只有 32 位。即使由于 32 位移位而导致高位字为负,它也不会回绕。我知道 javadoc 指出:

Because class {@code Random} uses a seed with only 48 bits, this algorithm will not return all possible {@code long} values.

在这种情况下,它可能不会有害,但例如GMU的MersenneTwister实现正是使用这个函数调用。这不会影响生成的随机数的质量吗?我在这里缺少什么?

最佳答案

Currently the lower word contributes 33 bits while the upper only has 32 bits.

...

What am I missing here?

正如 Jacob G 指出的,低位字贡献 32 位。不是 33 位。 32 位整数(粗略地说)是 31 位精度加上一个符号位。

在这种情况下,我们只是将 31 + 1 位视为位。那么代码的作用是获取两个由 32 个均匀分布的“随机”位组成的序列,将它们连接在一起以给出一个由 64 个均匀分布的“随机”位组成的序列...然后将其作为 long 返回>.

关于java - 为什么允许保留 nextLong() 的底部字有符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52350202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com