疑似乱数ジェネレータ
ランダムなデータが必要な分野はたくさんあります。
そのうちの1つはテストです。物事をうまくテストするには、テキスト、数値などのランダムなデータが必要になる場合があります。
JavaScriptではMath.random()
を使用できます。しかし、何かがうまくいかない場合は、まったく同じデータを使用してテストを繰り返すことができればよいでしょう。
そのために、いわゆる「シードされた疑似乱数ジェネレータ」が使用されます。これらは「シード」である最初の値を受け取り、同じシードが同じシーケンスを生成するような数式を使用して次の値を生成するため、フロー全体を簡単に再現できます。繰り返すにはシードを覚えておくだけで済みます。
やや均等に分散された値を生成するこのような数式の例
next = previous * 16807 % 2147483647
シードとして1
を使用すると、値は次のようになります。
16807
282475249
1622650073
- …以上…
タスクは次のような数式を備えたジェネレーターを作成することです。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
を用いたイテレーションとジェネレーターのコンポジションの機能を失います。この機能は、ほかの場所で有用な可能性があります。