为什么“(seed * 9301 49297)%233280 / 233280.0”生成一个随机数?

// Found this seed-based random generator somewhere
// Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)

var seed = 1;

/**
 * return a random number based on a seed
 * @param seed
 * @returns {number}
 */
function getNextValue() {
    seed = (seed * 9301 + 49297) % 233280;
    return seed/(233280.0);
}

function setSeed(_seed_) {
    seed = _seed_;
}

module.exports = {
    nextValue: getNextValue,
    seed: setSeed
};

https://github.com/dylang/shortid/blob/master/lib/random/random-from-seed.js

最佳答案 它不是一个随机数生成器,而是一个基于提供的种子的伪随机数.重置种子将重置getNextValue并提供一致的输出.

正如评论所提到的,这段代码基于The Central Randomizer.显然这段代码是因为Math.random在现在过时的Netscape 2中不起作用而创建的.反过来,这种实现基于现有的伪随机数生成器.有关此算法起源的更多信息,请参见Original source of (seed * 9301 + 49297) % 233280 random algorithm?.

从技术上讲,Math.random也是伪随机的,但您无法控制种子,因此此代码确实具有潜在有用的属性.如果为它提供一致的种子,则可以在重新加载时获得一致的输出.

点赞