在java.util.Random中生成伪随机数时使用的常数是什么?

时间:2019-06-06 10:22:27

标签: java random

我有点好奇什么是常数值(如果它们真的是常数 java.util.Random中使用的常量)。

我使用了方法setSeed(),并将其值设为3,并将其可以生成的值的限制设置为5random.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的值?

2 个答案:

答案 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中选择查看源。