在 JavaScript 中播种随机数生成器
简介:
JavaScript 的 Math.random( ) 函数虽然提供随机性,但不允许播种。这意味着每次调用该函数时,它都会生成一个新的数字序列,这对于需要可重复随机序列的情况可能会出现问题。
可种子伪随机数生成器:
由于 Math.random() 缺乏播种功能,因此有必要实现外部伪随机数生成器 (PRNG)提供播种功能。 PRNG 提供高质量的随机数,并允许使用一个或多个种子值进行初始化。
种子初始化:
PRNG 需要正确的初始化以确保随机性。分布良好的高熵种子值对于稳健的随机性至关重要。哈希函数(例如 cyrb128)可以从短字符串生成合适的种子。或者,可以使用虚拟数据作为多次生成器迭代的填充,以彻底混合初始状态。
性能注意事项:
JavaScript 数字仅支持最多 53 位整数分辨率和按位运算的 32 位分辨率。现代 PRNG 通常使用 64 位运算,但 JS 实现需要垫片,这会大大降低性能。所提出的 PRNG 算法优先考虑 32 位操作,以在 JavaScript 中实现最佳性能。
推荐的 PRNG:
sfc32(简单快速计数器)
sfc32 是一个快速 PRNG,具有 128 位内部状态,擅长 JavaScript。它表现出出色的随机性质量,常用于 PractRand 随机数测试套件。
示例用法:
function sfc32(a, b, c, d) { return function() { // State update logic ... return (t >>> 0) / 4294967296; // Convert to floating-point number in the range [0, 1) }; } const seedgen = () => (Math.random() * 2 ** 32) >>> 0; const getRand = sfc32(seedgen(), seedgen(), seedgen(), seedgen());
请注意,该示例使用简单的种子生成方法用于演示目的。在实践中,应该采用更强大的种子生成机制。
以上是如何在 JavaScript 中生成可重复的随机数?的详细内容。更多信息请关注PHP中文网其他相关文章!