如果有人需要这样做,我在这里提出了一个基于CPython 实现的工作版本。
注意:如果用字符串做种子,random.seed()
在 Python 2 和 3 之间切换。pythonStringHash
这里的函数兼容 Python 2 版本,或者在 Python 3 中,random.seed(s, version=1)
.
private static long pythonStringHash(String s) {
char[] chars = s.toCharArray();
long x;
if (s.isEmpty()) {
x = 0;
} else {
x = chars[0] << 7;
}
for (char c : chars) {
x = ((1000003 * x) ^ c);
}
x ^= chars.length;
if (x == -1) {
return -2;
}
return x;
}
private static void pythonSeed(MersenneTwister random, long seed) {
int[] intArray;
if (Long.numberOfLeadingZeros(seed) >= 32) {
intArray = new int[] { (int) seed };
} else {
intArray = new int[] { (int) seed, (int) (seed >> 32) };
}
random.setSeed(intArray);
}
public static RandomGenerator pythonSeededRandom(String seed) {
MersenneTwister random = new MersenneTwister();
pythonSeed(random, pythonStringHash(seed));
return random;
}
从那里, pythonSeededRandom("foo").nextDouble()
应该等于 random.seed("foo"); random.random()
。