Java的随机类的Javascript实现,它将生成具有相同种子的相同序列



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

最新更新