偽亂數產生器
有許多領域需要隨機資料。
其中一項是測試。我們可能需要隨機資料:文字、數字等,才能妥善測試。
在 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
進行反覆運算以及使用產生器組合的能力,這在其他地方可能很有用。