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

Random number generator in java with long seed values

本文关键字:随机数生成器 种子 java      更新时间:2023-09-26

超级noob问题(来自一个不了解比特技术的人):

我在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种子值很有效(例如,在JS和Java上,1234的种子给出相同的数字),但我的种子值很长。我必须如何更改按位运算符?

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);
    }
}

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

新建构造函数:

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

您是否尝试过只声明种子和第一个结果一样长?

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);
    }
}