首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中具有长种子值的随机数生成器

java中具有长种子值的随机数生成器
EN

Stack Overflow用户
提问于 2016-05-11 19:46:55
回答 2查看 559关注 0票数 0

超级菜鸟问题(来自一个不理解位的东西的人):

我在JavaScript (在我的服务器上)中使用下面的伪随机数生成器。

代码语言:javascript
复制
Math.seed = function(s) {
    var m_w  = s;
    var m_z  = 987654321;
    var mask = 0xffffffff;

    return function() {
      m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask;
      m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask;

      var result = ((m_z << 16) + m_w) & mask;
      result /= 4294967296;

      return result + 0.5;
    }
}

var myRandomFunction = Math.seed(1234);
var randomNumber = myRandomFunction();

现在我想在Java中使用它(在我的客户机上)。这适用于int种子值(例如,1234的种子值在JS和Java上提供相同的数字),但我的种子值是long。如何更改按位运算符?

代码语言:javascript
复制
public class CodeGenerator {
    private int m_w;
    private int mask;
    private int m_z;

    public CodeGenerator(int seed) {
        m_w = seed;
        m_z = 987654321;
        mask = 0xffffffff;
    }

    public int nextCode() {
        m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask;
        m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask;
        int result = ((m_z << 16) + m_w) & mask;
        double result2 = result / 4294967296.0;
        return (int)Math.floor((result2 + 0.5) * 999999);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-05-11 21:03:14

在Java中,您需要将种子掩码为unsigned int,然后它会生成与JS版本相同的数字。

新构造函数:

代码语言:javascript
复制
public CodeGenerator(long seed) {
    mask = 0xffffffff;
    m_w = (int) (seed & mask);
    m_z = 987654321;
}
票数 0
EN

Stack Overflow用户

发布于 2016-05-11 21:24:18

你有没有尝试过只声明种子和第一个结果?

代码语言:javascript
复制
public class CodeGenerator {
    private long m_w;
    private int mask;
    private int m_z;

    public static void main(String... a){
        System.out.println(new CodeGenerator(1234).nextCode()); //result = 237455
        System.out.println(new CodeGenerator(1234567891234L).nextCode()); //result = 246468
    }

    public CodeGenerator(long seed) {
        m_w = seed;
        m_z = 987654321;
        mask = 0xffffffff;
    }

    public int nextCode() {
        m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask;
        m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask;
        long result = ((m_z << 16) + m_w) & mask;
        double result2 = result / 4294967296.0;
        return (int)Math.floor((result2 + 0.5) * 999999);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37161708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档