伪随机数生成器
在许多领域,我们都需要随机数据。
其中之一是测试。我们可能需要随机数据:文本、数字等,以充分测试事物。
在 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
迭代和使用生成器组合的能力,这在其他地方可能有用。