我有点好奇什么是常数值(如果它们真的是常数
java.util.Random
中使用的常量)。
我使用了方法setSeed()
,并将其值设为3
,并将其可以生成的值的限制设置为5
或random.nextInt(5)
。
random.setSeed(3);
int[] n = new int[5];
for(int i = 0; i < n.length; i++) {
n[i] = random.nextInt(5);
}
生成的数字为4, 0, 0, 1, 3
。我知道java.util.Random
使用线性同余数生成器生成随机数。
X n + 1 =( a X n + c)mod m
现在,我该如何追溯或找到线性数同余生成器中使用的值。我知道X n 值是我输入的种子值,在这种情况下为3
。如何找到 m , a 和c的值?
答案 0 :(得分:3)
如果您查看java.util.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));
}
答案 1 :(得分:2)
关于您发布的公式:
X n + 1 =(aX n + c)mod m
random.setSeed(3);
等效于将X 0 设置为3
和
random.nextInt(5)
等同于执行m = 5的公式。
a和C的值可以通过java库源代码中的lookinng找到。为此,请在您的随机数上单击鼠标右键,然后在IDE中选择查看源。