Skip to content
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

Math.random の抱える課題

JavaScript の標準的な乱数生成器( Math.random )は幾つかの課題を抱えています。

  1. Random seed を与えられないため、再現性が無く、テストができません
  2. 乱数生成器(Random Generator)が一つしかなく、複数の乱数生成器を同時に扱うシーンでは役不足です

乱数を使ったゲームなどをテストするには、これらを解決した乱数生成器が必要になります。

Cで実装された Xorshift と互換性があります

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