Home
uupaa edited this page Sep 27, 2015
·
11 revisions
Random.js は 再現性を備えたランダムな値を生成する機能を提供します。
Random.js の内部ロジックは Xorshift を JavaScript で実装したものです。
// 乱数生成器を作成し、UINT32 の乱数を1つ生成する
var rand = new Random();
rand.next(); // 3701687786 (値の範囲は 0x00000000 - 0xFFFFFFFF になります)
// float 値で値を取得する
rand.next(true); // 0.8618663498200476
// 新しい乱数生成器を seeds を指定して作成する
var rand = new Random([123456789, 362436069, 521288629, 88675123]);
rand.next(true); // 0.8618663498200476
// 同じ乱数が生成される過程を再現する
var seed = Date.now();
var rand1 = new Random([seed]);
for (var i = 0; i < 100; ++i) { // 100回ランダム値を作成する
rand1.next();
}
var result1 = rand1.next(); // 101個目の値を取得する
var rand2 = new Random([seed], 100); // 100個読み飛ばす
var result2 = rand2.next(); // 101個目の値を取得する
console.log( rand1.next() === rand2.next() ); // -> true
JavaScript の標準的な乱数生成器( Math.random )は幾つかの課題を抱えています。
- Random seed を与えられないため、再現性が無く、テストができません
- 乱数生成器(Random Generator)が一つしかなく、複数の乱数生成器を同時に扱うシーンでは役不足です
乱数を使ったゲームなどをテストするには、これらを解決した乱数生成器が必要になります。
Random#next() と C言語版の Xorshift は同じ値を生成します。
以下は、XORShift のC言語版の実装です。
uint32_t xorshift(void) {
static uint32_t x = 123456789;
static uint32_t y = 362436069;
static uint32_t z = 521288629;
static uint32_t w = 88675123;
uint32_t t;
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}