レッスンに戻る

疑似乱数ジェネレータ

ランダムなデータが必要な分野はたくさんあります。

そのうちの1つはテストです。物事をうまくテストするには、テキスト、数値などのランダムなデータが必要になる場合があります。

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

そのために、いわゆる「シードされた疑似乱数ジェネレータ」が使用されます。これらは「シード」である最初の値を受け取り、同じシードが同じシーケンスを生成するような数式を使用して次の値を生成するため、フロー全体を簡単に再現できます。繰り返すにはシードを覚えておくだけで済みます。

やや均等に分散された値を生成するこのような数式の例

next = previous * 16807 % 2147483647

シードとして1を使用すると、値は次のようになります。

  1. 16807
  2. 282475249
  3. 1622650073
  4. …以上…

タスクは次のような数式を備えたジェネレーターを作成することです。pseudoRandom(seed)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を用いたイテレーションとジェネレーターのコンポジションの機能を失います。この機能は、ほかの場所で有用な可能性があります。

テスト付きのソリューションをサンドボックスで開きます。