【发布时间】:2013-01-31 00:00:58
【问题描述】:
在使用 java.util.Random 类时,如何才能以更有效的方式(特别是在 O(1) 中)获得 N 次调用 nextInt() 方法获得的值?
例如,如果我构造一个带有特定种子值的 Random 对象,我想在一个快速的方法,我能做到吗?
为简单起见,假设 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;
在探索了一下随机性之后,我发现随机值是使用线性同余生成器获得的。执行算法的实际方法是方法 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的问题?
【问题讨论】: