前面讲过了xorshift随机数算法,这是一种比较高效的伪随机数算法。但是JDK自带的伪随机数,并不是这么计算的
JDK自带的随机数算法叫做线性同余linear congruential随机数算法。
线性同余算法,简单说来就是
f
(
x
)
=
a
∗
x
+
b
f(x) = a*x + b
f(x)=a∗x+b.
算法名字叫线性,是因为这是个一次函数,名字里有个同余,是说对结果进行取余,取余是为了限定范围。比如要产生0~7之间的随机数就对8取余。
JDK使用的参数,
a
=
0
X
5
D
E
E
C
E
66
D
L
,
b
=
0
X
B
L
a=0X5DEECE66DL,b=0XBL
a=0X5DEECE66DL,b=0XBL。JDK部分源码如下:
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
mask值是0xffffffffffff,所以对mask进行与运算,纯粹是为了对前几位进行清零,不必考虑。核心代码在于线性函数(oldseed * multiplier + addend)。