调整XORShift发生器以返回最大值

eve*_*sor 10 java random performance

我需要在最大值内生成随机整数.由于性能至关重要,我决定使用XORShift生成器而不是Java的Random类.

long seed = System.nanoTime();
seed ^= (seed << 21);
seed ^= (seed >>> 35);
seed ^= (seed << 4);
Run Code Online (Sandbox Code Playgroud)

这个实现(源代码)给了我一个长整数,但我真正想要的是一个介于0和最大值之间的整数.

public int random(int max){ /*...*/}
Run Code Online (Sandbox Code Playgroud)

实现此方法的最有效方法是什么?

Fra*_*ank 8

我对你的代码感兴趣并想出了这个:

public class XORShiftRandom {

private long last;
private long inc;

public XORShiftRandom() {
    this(System.currentTimeMillis());
}

public XORShiftRandom(long seed) {
    this.last = seed | 1;
    inc = seed;
}

public int nextInt(int max) {
    last ^= (last << 21);
    last ^= (last >>> 35);
    last ^= (last << 4);
    inc += 123456789123456789L;
    int out = (int) ((last+inc) % max);     
    return (out < 0) ? -out : out;
}

}
Run Code Online (Sandbox Code Playgroud)

我做了一个简单的测试,它是大约倍的速度作为java.util.Random

如果您对它的工作方式感兴趣,可以阅读本文:

Disclamer:

上面的代码仅用于研究,而不是替代库存Random或SecureRandom.