SLOT 决策逻辑参考

Slot 算法决策图谱

本页共 7 张流程图,覆盖六类用户 RTP 分层、卷轴切换与中奖率纠偏、特殊玩法与 Jackpot 展示、奖池资金流转、用户保护机制、 平台硬保护与三级熔断的完整决策逻辑。这是一份纯逻辑说明,只描述规则本身如何运作,不对应任何具体代码或工程实现。

已确认规则 逻辑口径已经拍板 参数待定 方向已确认,具体数值尚未定案,当前按关闭/零值处理 待你确认 本轮新提或存在两种口径,需要你选定

与你本轮重新描述的规则相比,以下几点口径不同,需要你确认

  1. 大 R 用户的结果方式:你这次说"配置好的卷轴、真实随机";此前已确认的口径是大 R 用户使用预计算结果库,只有普通重度用户和大 R 重度用户使用真实卷轴随机。图二按此前口径绘制,如需改回真实卷轴,请明确告诉我。
  2. 破产保护的触发线:你这次说"不足以支付下一次下注";此前已确认修订为更宽松的"结算后余额低于当前下注 3 倍"。图六按 3 倍线绘制。
  3. 特殊玩法概率是否随时长 / 连输递增:方向已确认要做,但递增的起点、步长、封顶等具体参数尚未定案,当前口径是不随时长变化的平坦概率。图四已标为"参数待定"。
  4. 新用户"10 局以内必中":准确口径是第 10 个合格付费局起强制尝试命中 Free Spin 或 Bonus 之一(不含 Jackpot),仍需通过硬限制与资金检查,被拒时顺延到下一局继续尝试——不是无条件的绝对必中。
  5. 下注变化保护(升注 / 降注都提高中奖率,影响 20 局×差距系数):这是你本轮新提出的规则,此前未与其他保护机制的叠加顺序做出最终确认,需要你拍板它与充值、回归保护同时触发时谁优先。
  6. 强制熔断三级:与你的描述吻合,但要提醒——第一级"通知"的定义是生成通知意图记录,二三级"下架/停运"的定义是锁存并拒绝新请求;这套逻辑管的是"是否继续受理",是否真正对接外部邮件、机器人或游戏目录下架,属于这套判定逻辑之外的另一层范围。

01 · 单局执行总览

十四步执行顺序,硬限制检查引用最终否决优先级
flowchart TD
  s1["① 接收请求:校验会话 / 下注档 / 局编号 / 熔断准入"]
  s2["② 冻结本局配置版本、实际身份、生效身份、发展阶段、免费链上下文"]
  s3["③ 计算特殊玩法基础概率、未触发计数、连输链、新手体验保证、防跳注状态"]
  s4{"④ 按优先级依次抽样:免费旋转 → 奖励玩法 → 大奖池
首中即停止后续抽样"} s5["⑤ 未命中特殊玩法时,检查梯度下注强制零赔付"] s6["⑥ 基础玩法结算:结果库身份取预计算结果库 / 重度身份取真实卷轴随机"] s7["⑦ 真实卷轴专属链:上局>30倍 → 近20局纠偏 → 近100局纠偏 → 身份默认卷轴
再叠加充值 / 下注变化倾向"] s8["⑧ 若候选为零赔付,最多执行一次连输递增重抽"] s9["⑨ 仍为零赔付时,依次判定破产保护 / 用户输钱保护
命中一项后不再判定另一项"] s10{"⑩ 硬限制与资金检查:身份RTP、净盈利上限、平台周期硬保护、奖池余额"} s11["⑪ 候选被拒:按配置次数重新生成候选;仍无合法结果则提交零赔付回退"] s12["⑫ 原子提交:下注、手续费、奖池变化、派奖、余额、统计、决策记录"] s13["⑬ 若最终为零赔付且满足连续输条件,按近失预算 50% 概率仅替换玩家看到的展示盘面
不改变权威结果"] s14(["⑭ 前端停轴展示,盘面只能来自服务端"]) veto[["最终否决优先级(任何体验机制不可突破):
1 会话与配置版本有效
2 游戏未处于二/三级停运
3 用户RTP不超身份硬上限
4 净盈利不超身份硬上限
5 平台周期RTP/盈利目标未被突破
6 奖池余额充足,不挪用其他免费链预留
7 结算前后金币守恒,同局只提交一次"]] s1 --> s2 --> s3 --> s4 s4 -->|"命中特殊玩法"| s10 s4 -->|"全部未命中"| s5 --> s6 --> s7 --> s8 --> s9 --> s10 s10 -->|"通过"| s12 s10 -->|"拒绝"| s11 --> s10 s12 --> s13 --> s14 s10 -.->|"引用"| veto

这十四步与七条否决优先级是当前口径下单局结算的完整顺序,从接收请求到前端停轴逐步展开。

触发事故的那一局在第⑫步就已经原子提交并返回给玩家;熔断(图七)是提交之后的独立判定,不回滚已完成的这一局。第⑬步只替换玩家看到的画面,不产生任何金币,权威结果在第⑫步已经确定。

02 · 用户分层与身份

身份来源优先级 + 普通 / 大R 两条独立发展轨道
flowchart TD
  src0["身份来源优先级(从高到低)"] --> src1["① 人工演示选择"] --> src2["② 未来外部身份接口注入"] --> src3["③ 自然发展阶段:按累计付费局或累计下注,先达到者生效"]

  subgraph ord["普通价值轨道"]
    direction TB
    n1["新用户
RTP≤120% · 净盈利上限10万
预计算结果库"] n2["普通用户
RTP≤97% · 净盈利上限0
预计算结果库"] n3["普通重度用户
RTP≤97.5% · 净盈利上限0
真实卷轴随机"] n1 -->|"累计50付费局 或 累计下注5000,先达到"| n2 n2 -->|"累计300付费局 或 累计下注50000,先达到"| n3 end subgraph vip["大R价值轨道"] direction TB h1["大R新用户
RTP≤105% · 净盈利上限100万
预计算结果库"] h2["大R用户
RTP≤98% · 净盈利上限0
预计算结果库 ※"] h3["大R重度用户
RTP≤99% · 净盈利上限0
真实卷轴随机"] h1 -->|"同发展阶段条件"| h2 --> h3 end src3 -.-> ord src3 -.-> vip
公式 RTP = 累计派奖金币 ÷ 累计下注金币
账户净盈利 = 累计派奖金币 − 累计下注金币

已确认规则 六类身份、身份来源优先级(人工选择 > 外部输入 > 自然发展阶段)、"先达到者生效"的判定逻辑。

待你确认 ※ 大R用户此前已确认修订为预计算结果库,只有两类"重度"身份使用真实卷轴——这与你本轮重新描述的口径不同,见页顶差异说明第1条。

普通价值与大R价值是两条平行轨道:大R新用户不会"发展"成普通用户,两条轨道各自应用相同形状的发展阶段条件。免费旋转链进行期间,触发局的身份被冻结,不会在链中途切换。

03 · 卷轴选择与中奖率纠偏

卷轴优先级链:大赢恢复 → 20局纠偏 → 100局纠偏 → 身份默认(仅适用于真实卷轴身份)
flowchart TD
  s0(["真实卷轴身份进入基础玩法"]) --> c1{"上一局倍率 > 30倍?"}
  c1 -->|"是"| high["选择:高中奖率卷轴(最高优先级)"]
  c1 -->|"否"| c2{"最近20个付费局
中奖率 < 50%?"} c2 -->|"是"| high c2 -->|"否"| c3{"最近100个付费局
中奖率偏离中卷轴目标 > 10个百分点?"} c3 -->|"偏高"| low["选择:低中奖率卷轴"] c3 -->|"偏低"| high c3 -->|"未偏离"| deftier["选择:身份默认卷轴(通常为中卷轴)"] high --> bias["叠加:充值保护 / 下注变化保护
可进一步按独立概率倾向高卷轴"] low --> bias deftier --> bias bias --> spin["随机停点 → 公开赔率表结算"] spin --> zero{"结算结果 = 零赔付?"} zero -->|"否"| out(["候选结果"]) zero -->|"是,且连续零赔付≥2局"| retry["额外重抽:10%起始概率,之后每局+10个百分点,封顶100%
每付费局最多重抽一次"] zero -->|"是,未满足连续条件"| out retry --> out note1[["三档卷轴参考中奖率:高≈50% / 中≈35% / 低≈15%
各档允许上下浮动约10个百分点,但须保持梯度
高中奖率卷轴显著抑制 >50倍 派奖"]] bias -.-> note1
公式 纠偏判定:|实际中奖率 − 中卷轴目标中奖率| > 10个百分点
连续零赔付重抽概率:p(n) = min(100%, 10% + 10%×(n−2)),n为当前连续零赔付局数,n≥2起生效,每局至多重抽一次

已确认规则 优先级固定为:上一局>30倍 > 最近20局纠偏 > 最近100局纠偏 > 身份默认卷轴;充值和下注变化保护只能在这条链之后再叠加倾向,不能跳到最前面。

三档卷轴的参考中奖率是设计目标区间,不是某一次具体运行必然落在的精确值;高中奖率卷轴对>50倍派奖有显著抑制,避免高卷轴反而放大大额赔付。

04 · 特殊玩法概率与 Jackpot 展示

特殊玩法独立抽样 + 新用户前10局体验保证
flowchart TD
  p0["本局:按生效身份读取 Free Spin / Bonus / Jackpot 各自独立基础概率"] --> p1{"有效概率 = min(封顶, 基础概率 + 未触发递增 + 连输提升)"}
  p1 -.-> pnote[["当前口径:未触发递增与连输提升的参数尚未定案,按关闭处理(flat)
有效概率 = 基础概率,不随游戏时长或连输自动增加"]] p1 --> g{"是否为新用户/大R新用户
且处于前10个合格绑定档付费局窗口?"} g -->|"第1–9局:自然触发即完成窗口"| draw["按优先级独立抽样:Free Spin → Bonus → Jackpot
首个命中即停止后续抽样"] g -->|"窗口已完成 / 非绑定档局"| draw g -->|"第10局起仍未中:due / overdue"| force["强制尝试选定一个 Free Spin / Bonus 目标(Jackpot 不作为强制目标)
该目标有效概率覆盖为1"] force --> guard{"是否通过硬限制与资金检查?"} guard -->|"通过"| hit(["特殊玩法命中"]) guard -->|"被拒"| overdue["窗口保持/进入 overdue,不计入完成
下一个合格付费局继续尝试"] draw --> hit2{"任一玩法命中?"} hit2 -->|"是"| hit hit2 -->|"否"| base(["转入基础玩法(图三 / 图一 ⑤起)"])
Jackpot:真实奖池与模拟展示值彻底隔离
flowchart LR
  bet["玩家下注"] --> real1["真实奖池 authoritativePool
参与资金检查 / 账务 / 守恒 / 事故检测"] bet -. 不影响 .-> fake1["展示池 presentationPool
512个预排模拟事件,每10秒一个tick"] fake1 --> fakeGrow["按当前真实入池口径模拟增长
每个事件1–20个模拟用户,最小+1"] fakeGrow --> fakeCut{"1%概率模拟扣减
或 展示值 > 真实值×1.5?"} fakeCut -->|"是"| fakeDeduct["模拟扣减:扣减额 = 模拟中奖下注 ÷ 最大下注 × 当前展示值"] fakeCut -->|"否"| fakeGrow hitReal["某局真实提交 Jackpot 命中"] --> swap["切换 actual_settlement 模式
展示赔付前的真实池快照"] real1 -.->|"唯一交汇点:真实命中时"| swap swap --> settle["派彩揭晓:展示值同步为赔付后真实值"] settle --> resume["下一个tick恢复 simulated 模式"]
公式 flat: p = base
additive_drought: p = min(cap, base + increment × 未触发局数)
linear_prd: p = min(cap, coefficient × (未触发局数 + 1))
有效概率 = min(cap, p + 连输提升)
Jackpot模拟扣减额 = 模拟中奖下注 ÷ 最大下注 × 当前展示值
候选对照公式(非当前生效值):P(N) = min(1, 0.00025×N),累计至第N局触发概率 = 1 − ∏(1−P(i))

参数待定 未触发递增/连输提升:方向已确认,但增量、起点、封顶、适用身份均未定案,当前口径是不随时长或连输变化的平坦概率——直接回答你的追问:当前不会自动递增。

已确认规则 新用户体验保证:窗口按"已提交的合格绑定档付费局数"计数(不是墙钟时间),第10局起强制尝试而非无条件必中,被拒时顺延到下一局继续尝试。

已确认规则 Jackpot假数字:与你描述的"随时间序列模拟下注增长、不定时扣掉模拟中奖"完全吻合——512个预生成有序事件、每10秒一个节拍、1%概率或展示值超真实值1.5倍时触发模拟扣减,全过程不接触真实奖池,只有真正命中的那一局才切到真实结算快照。

05 · 资金与奖池流转

下注 → 手续费 → 奖池分配 → 新手超额赔付
flowchart TD
  bet["玩家付费下注金额"] --> fee["扣除0.5%手续费
累计统计,不参与随机概率判定"] fee --> pool["剩余进入总奖金池体系"] pool --> nb["按1%分配 → 新手保护池(上限200万)"] pool --> bp["按0.5%分配 → 破产保护池(上限50万)"] pool --> sf["按各玩法配置比例分配 → 特殊玩法池
比例由95%数学贡献目标与手续费反推"] nb -.->|"达到上限"| nbcap["停止继续分配,维持在上限"] bp -.->|"达到上限"| bpcap["停止继续分配,维持在上限"] win["新用户获得中奖结算"] --> chk{"本次赔付是否超出
该用户自身RTP 100%的部分?"} chk -->|"是"| draw2{"新手保护池余额
是否足够覆盖超出部分?"} draw2 -->|"足够"| pay["由新手保护池承担超出部分"] draw2 -->|"不足"| retry2["该次中奖重新随机候选"] chk -->|"否"| normalpay["正常从奖池扣付,不涉及新手池"]
公式 手续费 = 下注金额 × 0.5%
新手保护池分配 = 入池金额 × 1%(上限200万)
破产保护池分配 = 入池金额 × 0.5%(上限50万)
数学贡献目标:总RTP 95% = 基础玩法60% + 免费旋转25% + 奖励玩法9% + 大奖池1%

已确认规则 手续费与两个保护池的分配比例、上限,以及新手保护池对新用户超额赔付的兜底与重新随机。

规则里只描述了破产保护池的累计与上限,没有明确写出它是否直接为破产保护的替换赔付出资——破产保护实际生效方式是图六的"结果替换为预生成盘面",这两者在规则里没有被显式连接,为避免编造一条资金流向,如实标注在此。

06 · 用户保护机制总览

破产 / 输钱保护判定顺序 + 四项独立触发型保护
flowchart TD
  cand["零赔付候选结果"] --> pr1{"破产保护:结算后余额 < 当前下注×3?
且当日次数未耗尽(默认3–10次/身份)"} pr1 -->|"是"| sub1["替换为预生成 1–5倍 中奖盘面
命中后不再判定输钱保护"] pr1 -->|"否"| pr2{"用户输钱保护:自定义周期内
RTP或绝对亏损是否跌破该身份下限?"} pr2 -->|"是"| sub2["替换为预生成 5–20倍 中奖盘面"] pr2 -->|"否"| final["维持零赔付"] ret["会话空闲 > 24小时"] -.-> retp["回归保护:接下来10–20个付费局
按同价值层级新用户策略执行
免费旋转链期间不切换"] dep["1小时内充值达到10/20/50/100美元档位"] -.-> depp["充值保护:提高中奖行为
结果库身份提高命中概率 / 真实卷轴身份提高选高卷轴概率"] bet1["连续提高下注达到配置次数(默认3次)"] -.-> ladder{"再次提高下注?"} ladder -->|"是"| forcezero["本局强制零赔付
特殊玩法优先于此规则"] hop["同一下注档反复出现的低注/高注切换"] -.-> antihop["防跳注:按下注档×生效身份独立动态桶
最近29局加权,当前下注>加权均值2倍时抑制动态优惠"] betchg["下注金额升高或降低,且未触发梯度必输"] -.-> betchgp["下注变化保护:提高中奖率
影响局数 = 20局 × 变化差距系数"]
公式 破产保护触发:结算后余额 < 当前下注 × 3
防跳注抑制条件:当前下注 > 2 × 最近29局线性加权平均下注(至少5个样本)
下注变化保护影响局数 = 20局 × 变化差距系数(候选口径,见右侧待确认)

已确认规则 破产保护(3倍下注危险线)、输钱保护(5–20倍替换盘面)、回归保护(10–20局新用户策略)、充值保护(四档)、梯度下注必输(连续3次)、防跳注(29局线性加权、严格大于2倍)。

参数待定 回归、充值、下注变化三种提升同时出现时的最终叠加规则尚未定案(谁优先、能否叠加)。

待你确认 下注变化保护是本轮新提出的规则,需要你明确它与充值保护、回归保护同时触发时的优先级。

07 · 平台硬保护与三级熔断

新请求判定顺序 → 六类监控 → 事故分级 → 显式恢复
flowchart TD
  req["新的玩家变更请求:旋转 / 充值 / 身份变更 / 时钟变更等"] --> chk1{"该spinId是否已有保留结算?"}
  chk1 -->|"是"| replay["直接返回原结算,不重新抽样、不重复扣款"]
  chk1 -->|"否"| chk2{"平台或该游戏的熔断是否已锁存?"}
  chk2 -->|"L2/L3已开启"| reject["拒绝请求:GAME_CIRCUIT_OPEN 或 PLATFORM_CIRCUIT_OPEN(HTTP 503)"]
  chk2 -->|"未开启"| proceed["正常执行Slot决策与平台硬保护(见图一 ⑩)"]
  proceed --> commit["原子提交结算"]
  commit --> monitor["结算后运行六类熔断监控"]
  monitor --> m1["platform_guard_rtp
平台周期RTP超Guard上限"] monitor --> m2["session_profile_rtp
会话RTP超身份上限"] monitor --> m3["session_profile_net_profit
净盈利超身份上限"] monitor --> m4["pool_balance_floor
奖池余额低于下限"] monitor --> m5["pool_balance_cap
奖池余额高于上限"] monitor --> m6["state_non_finite
关键账务状态非有限数"] m1 --> breach{"连续突破次数达到规则阈值?"} m2 --> breach m3 --> breach m4 --> breach m5 --> breach m6 --> breach breach -->|"是"| incident["创建 / 更新事故"] breach -->|"否"| clear["清零该指纹连续突破计数"] incident --> lvl{"事故等级"} lvl -->|"L1"| notify["写入通知意图记录,游戏继续受理"] lvl -->|"L2"| suspend1["锁存该游戏受理关闭,下一次新请求起拒绝"] lvl -->|"L3"| suspend2["锁存平台级受理关闭,覆盖同监督器全部游戏"] suspend1 --> ack["运营确认事故(ack)"] suspend2 --> ack ack --> recheck["显式恢复请求:基于当前权威状态做一次只读健康复查"] recheck --> healthy{"全部相关条件已恢复健康?"} healthy -->|"是"| reopen["解除锁存,恢复受理"] healthy -->|"否"| staylock["维持锁存,拒绝本次恢复"]
定义 事故指纹 = gameId + ruleId + monitor + scope + scopeKey(同一指纹只保留一个进行中的事故)

已确认规则 六类监控、连续突破计数、L1/L2/L3三级锁存、确认+只读健康复查后才能显式恢复。

L1的"通知"定义为生成通知意图记录,L2/L3的"下架/停运"定义为锁存并拒绝新请求——这套逻辑管的是"是否继续受理",是否真正对接外部邮件、机器人或游戏目录下架,属于这套判定逻辑之外的另一层范围。

关键边界:触发事故的那一局在熔断判定之前就已经原子提交并正常返回给玩家,熔断不会回滚它;平台硬保护(图一⑩)在结算前拒绝违规候选,是独立于本图的另一道防线。