疑似乱数ジェネレータ
ランダムデータが必要となる多くの場面があります。
その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
を使ったイテレートや、ジェネレータの合成を使うことはできなくなります。