返回課程

偽亂數產生器

有許多領域需要隨機資料。

其中一項是測試。我們可能需要隨機資料:文字、數字等,才能妥善測試。

在 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 進行反覆運算以及使用產生器組合的能力,這在其他地方可能很有用。

在沙盒中開啟包含測試的解決方案。