1st我在这里进行了多次搜索,并通过谷歌试图找到它,如果我没有使用正确的搜索词来找到它,我很抱歉提前找到它。
我正在将一些遗留的Java代码重写为Javascript,除了伪随机数生成器之外,我已经完成了所有工作。。。我需要这个代码的Javascript版本通过这个代码的Java和Javascript版本都有可重复的输出,因为我不能使用Javascript的RN生成器。。。我也无法更改遗留代码以使用另一个RN生成器。。。。
所以我希望有人也遇到过类似的情况,并且已经这样做了,并将Java的RNG编写/移植到了Javascript中?
如果javascript的逐位运算符只处理32位字,而Java的RNG是基于64位种子的,这可能吗。。。显然需要两个变量,每个变量都有1/2的种子。。。
来自https://docs.oracle.com/javase/8/docs/api/java/util/Random.html
-
Java的setSeed执行
(seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)
-
接下来是
(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
-
并返回
(int)(seed >>> (48 - bits)).
我创建了一个ES6类,它在测试中产生的结果与java.util.Random
类相同。到目前为止,我只实现了.nextInt()
公共方法,但它是通过受.next()
保护的方法实现的,所以其他公共方法应该很容易实现:
https://gist.github.com/raybellis/4c15a1746724be7bd03964e9d03e0c75
EDIT此功能的增强版现在可作为NPM:使用
https://www.npmjs.com/package/java-random