レッスンに戻る

疑似乱数ジェネレータ

ランダムデータが必要となる多くの場面があります。

その1つはテストです。テキスト、数値など、上手くテストを行うためにはランダムなデータが必要になります。

JavaScript では Math.random() を使うことができます。しかし、何か問題が起きた場合、まったく同じデータを使用して繰り返しテストができればよいです。

そのために、“シード疑似乱数ジェネレータ” と呼ばれるものが使われます。それらは最初の値である “シード(種)” を取り、以降公式を使って次の値を生成します。同じシードは同じ一覧の数列を生成するので、フロー全体を簡単に再現することができます。繰り返すのに覚えておく必要があるのはシードだけです。

これは、このような公式の例で、幾分か一様に分布した値を生成します。:

next = previous * 16807 % 2147483647

シードに 1 を使うと、値は次のようになります:

  1. 16807
  2. 282475249
  3. 1622650073
  4. …など…

このタスクは、seed を取り、この式でジェネレータを生成するジェネレータ関数 pseudoRandom(seed) を作成することです。

使用例:

let generator = pseudoRandom(1);

alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073

テストと一緒にサンドボックスを開く

function* pseudoRandom(seed) {
  let value = seed;

  while(true) {
    value = value * 16807 % 2147483647
    yield value;
  }

};

let generator = pseudoRandom(1);

alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073

注意してください。次のように通常の関数でも同じことができます:

function pseudoRandom(seed) {
  let value = seed;

  return function() {
    value = value * 16807 % 2147483647;
    return value;
  }
}

let generator = pseudoRandom(1);

alert(generator()); // 16807
alert(generator()); // 282475249
alert(generator()); // 1622650073

これは、このコンテキストでは問題ありません。しかし、どこかで役立つかのしれない for..of を使ったイテレートや、ジェネレータの合成を使うことはできなくなります。

サンドボックスでテストと一緒に解答を開く