gpt4 book ai didi

java - 为什么 java.util.Random 使用掩码?

转载 作者:搜寻专家 更新时间:2023-10-31 19:49:42 24 4
gpt4 key购买 nike

简化(即,将并发排除在外)Random.next(int bits) 看起来像

protected int next(int bits) {
seed = (seed * multiplier + addend) & mask;
return (int) (seed >>> (48 - bits));
}

其中使用掩码将种子减少到 48 位。为什么它比仅仅更好

protected int next(int bits) {
seed = seed * multiplier + addend;
return (int) (seed >>> (64 - bits));
}

?我已经阅读了很多关于随机数的文章,但没有理由这样做。

最佳答案

原因是较低的位往往具有较低的周期(至少对于 Java 使用的算法)

来自 Wikipedia - Linear Congruential Generator :

As shown above, LCG's do not always use all of the bits in the values they produce. The Java implementation produces 48 bits with each iteration but only returns the 32 most significant bits from these values. This is because the higher-order bits have longer periods than the lower order bits (see below). LCG's that use this technique produce much better values than those that do not.

编辑:

进一步阅读(方便地,在维基百科上)后,a、c 和 m 的值必须满足这些条件才能具有完整的周期:

  1. c和m必须互质

  2. a-1 可被 m 的所有质因数整除

  3. 如果m是4的倍数,a-1是4的倍数

我唯一可以清楚地说仍然满意的是#3。 #1 和 #2 需要检查,我感觉其中一个(或两个)失败了。

关于java - 为什么 java.util.Random 使用掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588876/

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