使用类 java.util.Random 时,如何获得通过调用方法 nextInt() N 次获得的值,但以更有效的方式(特别是在 O(1) 中)?
例如,如果我构造一个带有特定种子值的 Random 对象,我想快速获取第 100,000 个“nextInt() 值”(即调用 nextInt() 方法 100,000 次后得到的值) ,我能做到吗?
为简单起见,假设 JDK 版本为 1.7.06,因为可能需要知道 Random 类中某些私有字段的确切值。说起来,我发现以下字段与随机值的计算相关:
private static final long multiplier = 0x5DEECE66DL;
private static final long addend = 0xBL;
private static final long mask = (1L << 48) - 1;
在对随机性进行了一些探索之后,我发现随机值是使用Linear congruential generator获得的。执行算法的实际方法是方法 next(int):
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));
}
该算法的相关行是获得下一个种子值的行:
nextseed = (oldseed * multiplier + addend) & mask;
那么,更具体地说,有没有一种方法可以推广这个公式来获得“nth nextseed”值?我在这里假设,在有了它之后,我可以通过让变量“bits”为 32 来简单地获得第 n 个 int 值(方法 nextInt() 只需调用 next(32) 并返回结果)。
提前致谢
PS:也许这是一个更适合mathexchange的问题?