疑似乱数ジェネレータ
ランダムデータが必要となる多くの場面があります。
その1つはテストです。テキスト、数値など、上手くテストを行うためにはランダムなデータが必要になります。
JavaScript では Math.random()
を使うことができます。しかし、何か問題が起きた場合、まったく同じデータを使用して繰り返しテストができればよいです。
そのために、“シード疑似乱数ジェネレータ” と呼ばれるものが使われます。それらは最初の値である “シード(種)” を取り、以降公式を使って次の値を生成します。同じシードは同じ一覧の数列を生成するので、フロー全体を簡単に再現することができます。繰り返すのに覚えておく必要があるのはシードだけです。
これは、このような公式の例で、幾分か一様に分布した値を生成します。:
next = previous * 16807 % 2147483647
シードに 1
を使うと、値は次のようになります:
16807
282475249
1622650073
- …など…
このタスクは、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
を使ったイテレートや、ジェネレータの合成を使うことはできなくなります。