スーパー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);
}
}
...なぜあなたはhttps://docs.oracle.com/javase/7/docs/api/java/util/Random.htmlを使用していませんか? – Niels
変数とメソッドをlongで宣言します。 – fhofmann
@fhofmannこれは異なる番号を生成します。同じ種子のために同じものが必要です。 – obiwahn