javascript - Java Random 类的 Javascript 实现,它将生成具有相同种子的相同序列
问题描述
第一次我在这里和通过谷歌进行了多次搜索,如果我没有使用正确的搜索词来找到它,我很抱歉提前找到它。
我正在将一些遗留的 Java 代码重写为 Javascript,除了伪随机数生成器之外,我已经完成了所有工作......我需要这段代码的 Javascript 版本通过这段代码的 Java 和 Javascript 版本具有可重复的输出为这样我不能使用 Javascript 的 RN 生成器...我也不能更改旧代码以使用另一个 RN 生成器....
所以我希望有人遇到过类似的情况并且已经这样做并将Java的RNG编写/移植到Javascript中?
考虑到 javascripts 位操作符仅适用于 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
编辑此增强版本现在可作为 NPM 使用:
推荐阅读
- javascript - 动态合并类似于 SQL JOIN 的数据:通过函数 INDEX 和 MATCH:google 电子表格
- typescript - 在定义中,仅当泛型类型是数组时,我才需要特定的方法签名
- python - 在 keras 中加载具有自定义损失的模型(缺少成员)
- elixir - 在这个 ExUnit 测试运行器中,为什么在这里调用 ExUnit.Server.modules_loaded()?
- c - 在简单的汇编 x86 中无法理解 %rax 的值
- reactjs - React Native (View) onLayout 不执行函数
- angular - 服务器端渲染 Angular 6.1
- sql - 如何在 SQL Server 中显示 2 个带有“分组依据”的查询作为一个查询
- django - 无法将 DB 的所有行打印到 Django 模板
- go - ZMQ 无法接收来自多个发布者的消息