返回课程

伪随机数生成器

在许多领域,我们都需要随机数据。

其中之一是测试。我们可能需要随机数据:文本、数字等,以充分测试事物。

在 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迭代和使用生成器组合的能力,这在其他地方可能有用。

在沙箱中打开带有测试的解决方案。