You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mulberry32工厂函数如何返回有状态函数?求原理解释

关于mulberry32有状态函数的实现原理解释

以下代码返回一个有状态函数。尝试多次调用该工厂函数生成的输出函数,重新生成后再次调用,会发现输出一致,说明它在多次调用间保留了状态。
但我不太清楚这是如何实现的……能否有人解释?

function mulberry32(a) {
    return function() {
      var t = a += 0x6D2B79F5;
      t = Math.imul(t ^ t >>> 15, t | 1);
      t ^= t + Math.imul(t ^ t >>> 7, t | 61);
      return ((t ^ t >>> 14) >>> 0) / 4294967296;
    }
}

这个逻辑的核心是**闭包(Closure)**机制,具体拆解:

  • 当你调用mulberry32(a)时,这个外部函数会创建一个局部变量a,随后返回内部的匿名函数。
  • 内部函数在定义时就"抓"住了外部函数的a变量——哪怕外部函数mulberry32执行完退出了,内部函数依然保留着对这个a的引用,这个被保留的变量就成了内部函数的私有状态。
  • 每次调用内部函数时,a += 0x6D2B79F5会直接修改这个被捕获的a的值,修改后的结果会被存下来,供下一次调用内部函数时继续使用。
  • 如果你用同一个初始值重新调用mulberry32,会生成一个全新的a变量和对应的内部函数,所以新函数的调用序列会和之前的完全一致——因为它是从新的初始a开始计算的。

举个直观的例子:

// 用初始值1生成第一个随机函数
const rand1 = mulberry32(1);
console.log(rand1()); // 第一次调用,修改了内部的a
console.log(rand1()); // 第二次调用,基于修改后的a继续计算

// 用同样初始值1生成第二个随机函数
const rand2 = mulberry32(1);
console.log(rand2()); // 和rand1的第一次输出完全一致,因为rand2的a是全新的初始值1

内容的提问来源于stack exchange,提问作者user1543574

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:25:23