javascript - 在 Java 和 Python 中实现相同的 XorShift

标签 javascript java python numpy random

我想用 Java、Python 和 JavaScript 实现 XorShift PRNG。给定相同的种子,不同的实现必须生成完全相同的序列。到目前为止,我还无法做到这一点。

我在 Java 中的实现

在 Java 中具有以下 XorShift PRNG 实现(其中 x 是一个 long 字段):

public long randomLong() {
    x ^= (x << 21);
    x ^= (x >>> 35);
    x ^= (x << 4);
    return x;
}

如果我将 x 设为 1,对 randomLong() 的前四次调用将生成:

35651601
1130297953386881
-9204155794254196429
144132848981442561

我在 Python 中的实现

我已经尝试过使用和不使用 numpy。下面是使用 numpy 的版本。

def randomLong(self):
    self.x ^= np.left_shift(self.x, 21)
    self.x ^= np.right_shift(self.x, 35)
    self.x ^= np.left_shift(self.x, 4)
    return self.x

使用相同的种子,Python 函数将生成:

35651601
1130297953386881
-9204155787274874573 # different
143006948545953793   # different

我的 JavaScript 实现

我还没有尝试过,因为 JavaScript 的唯一数字类型似乎是基于 IEEE 754 的 double ,这打开了另一种蠕虫病毒。

我认为是什么原因

Java 和 Python 有不同的数字类型。 Java 有 32 位和 64 位整数,而 Python 有时髦的 big int 类型。

似乎移位运算符具有不同的语义。例如,在 Java 中同时存在逻辑和算术移位,而在 Python 中只有一种类型的移位(逻辑?)。

问题

如果答案能让我用这三种语言编写 PRNG,而且速度很快,我会很高兴。它不必非常好。我考虑过将 C 库实现移植到其他语言,尽管这不是很好。

  • 我可以修复我的上述实现以使其正常工作吗?
  • 我是否应该切换到另一个更容易跨 prog.langs 实现的 PRNG 函数?

我已阅读 SO,其中有人建议对 Python 使用 java.util.Random 类。我不想要这个,因为我还需要 JavaScript 中的函数,而且我不知道那里有这个包。

最佳答案

I would be happy with an answer that lets me write a PRNG in these three languages, and one that is fast. It does not have to be very good.

你可以实现一个 32 位的 linear congruential generator 3 种语言。

python :

seed = 0
for i in range(10):
    seed = (seed * 1664525 + 1013904223) & 0xFFFFFFFF
    print(seed)

Java:

int seed = 0;
for (int i = 0; i < 10; i++) {
    seed = seed * 1664525 + 1013904223;
    System.out.println(seed & 0xFFFFFFFFL);
}

JavaScript:

var seed = 0;
for (var i = 0; i < 10; i++) {
    // The intermediate result fits in 52 bits, so no overflow
    seed = (seed * 1664525 + 1013904223) | 0;
    console.log(seed >>> 0);
}

输出:

1013904223
1196435762
3519870697
2868466484
1649599747
2670642822
1476291629
2748932008
2180890343
2498801434

请注意,在所有 3 种语言中,每次迭代都会打印一个无符号的 32 位整数。

关于javascript - 在 Java 和 Python 中实现相同的 XorShift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34658565/

相关文章:

javascript - Gulp 断言错误 [ERR_ASSERTION] : Task function must be specified after Node and NPM update

javascript - 使用 Meteor 按数组对象中的日期字段排序

java - 是否可以设置Hibernate的 "default"变量名映射?

javascript - 如何在 JS 中创建辅助函数?

javascript - 我如何知道何时在输入字段中输入了一个字符?

java - 如何防止 cxf-codegen-plugin 为所有 wsdl 文件生成源

java - android中的最后一个字节

python - Python 中二叉搜索树的广度优先搜索

python - 使用 Python 连接 ElephantSQL

python - 自定义损失函数: NotImplementedError: Cannot convert a symbolic Tensor (truediv_2:0) to a numpy array