2016-05-11 7 views
0

スーパー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シード値(例えば、1234のシードはJSとJavaで同じ数を返します)では問題なく動作しますが、シード値は長くなります。どのようにビット演算子を変更する必要がありますか?

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

...なぜあなたはhttps://docs.oracle.com/javase/7/docs/api/java/util/Random.htmlを使用していませんか? – Niels

+0

変数とメソッドをlongで宣言します。 – fhofmann

+0

@fhofmannこれは異なる番号を生成します。同じ種子のために同じものが必要です。 – obiwahn

答えて

0

Javaでは、符号なし整数にシードをマスクする必要があります。その場合、JSバージョンと同じ番号が生成されます。

新しいコンストラクタは:

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

は、あなただけのシードと第一結果として長い宣言をしたことがありますか?好奇心のうち

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