1. 随机性质量
    Mulberry32
    优点:

比 LCG 有更好的随机性分布(通过更多的位混合操作)。

通过多次位移和异或运算,减少明显的周期性模式。

适用于游戏、模拟等需要较高随机性质量的场景。

缺点:

计算量比 LCG 稍大(但现代 JS 引擎优化后影响很小)。

LCG(线性同余法)
优点:

计算简单,性能极高(仅 1 次乘法和取模运算)。

如果参数选得好(如 a=48271, m=2^31-1),可以满足基本需求。

缺点:

随机性较差,低阶比特(最低几位)可能呈现明显规律(如奇偶交替)。

如果参数选择不当(如 a=1664525, c=1013904223),可能在高维空间(如 3D 噪声)出现明显规律。

结论:Mulberry32 的随机性 明显优于 LCG,尤其在高频调用或需要高质量随机数的场景。

  1. 性能
    Mulberry32
    使用 位运算(>>>、^、|) 和 Math.imul,在现代 JS 引擎(V8、SpiderMonkey)上优化良好。

虽然比 LCG 多几次运算,但实际性能差异极小(< 10%)。

LCG
仅 1 次乘法 + 1 次取模,理论上是更快的。

但 JavaScript 的 % 运算在负数时表现不一致,可能需要额外处理。

结论:LCG 稍快,但 差距极小,除非每秒生成上百万个随机数,否则可忽略不计。

  1. 周期长度
    Mulberry32:周期为 2^32(约 42 亿),足够大多数应用。

LCG:

如果 m=2^32,周期最多 2^32(但参数选择不好时可能更短)。

如果 m=2^31-1(如 MINSTD),周期 2^31-1(约 21 亿)。

结论:Mulberry32 周期更长,但 LCG 如果参数选好(如 a=48271, m=2^31-1)也能满足需求。

  1. 适用场景
    场景 推荐算法
    游戏开发(如地图生成、AI决策) Mulberry32(随机性更好)
    模拟仿真(如物理引擎) Mulberry32
    简单随机化(如抽奖、洗牌) LCG(足够)
    需要极高性能(如每帧生成大量随机数) LCG(稍快)
    加密安全场景(如密钥生成) 都不能用! 必须用 crypto.getRandomValues()

标签: none

添加新评论