hyapp-server/docs/幸运礼物产品文档.md
2026-06-25 23:35:44 +08:00

12 KiB
Raw Permalink Blame History

幸运礼物 · 必爆隐藏奖池产品方案6.25 版)

文档信息

内容
版本 v1.0
日期 2026-06-25
范围 语音房幸运礼物的新一版产品与算法方案
状态 产品方案,不能直接等同于当前代码已上线能力

目标是在语音房送礼场景里提供一个极简、高方差、长期自平衡的幸运礼物系统。用户侧只感知“送礼 -> 开奖 -> 结果表现”,后台通过隐藏奖池完成持续喂池和必然爆池。平台先抽水,剩余资金进入小奖反馈层和隐藏奖池层,所有开奖必须可审计、可重放。

1. 项目背景与目标

1.1 背景

用户发送幸运礼物后,需要马上获得强反馈。传统固定倍数或简单随机容易出现长时间无大奖、低波动、低传播的问题,用户会认为玩法“干等”或“不刺激”。新方案用三层反馈叠加:

  • 高频小奖让每次送礼都有反馈。
  • 稀有大奖制造黑天鹅惊喜。
  • 必爆隐藏奖池保证在可控贡献量内一定出现大额 payout。

1.2 核心目标

目标 说明
用户侧 每次送礼都有独立开奖体验,高频小奖、稀有大奖和必爆大奖叠加。
平台侧 每笔先抽水,剩余奖池自平衡,不允许平台倒贴。
长期循环 通过“持续喂池 -> 必然爆池 -> 留底滚动”形成可持续戏剧性循环。
认知成本 用户端不展示复杂池子、爆点和概率,只触发送礼并接收结果。
审计公平 每次开奖记录 before/after、随机因子、trigger 状态和结果,支持事后重放。

1.3 成功标准

  • 单次 100 金礼物的玩家侧期望返还约为 75-78 金。
  • 必爆机制保证在可控贡献量内一定出现大额 payout。
  • 大奖释放后隐藏奖池仍保留 52%-68% 底池,继续滚雪球。
  • 内部账号、机器人和主播测试流量不能真实消耗 J Fund。

2. 核心设计理念

2.1 三层爽感

层级 机制 产品意义
高频层 S Fund 超过 58% 概率获得正返还。 维持连续发送行为,避免每次都空。
稀有大奖层 J Fund 1% 概率按隐藏池百分比释放。 形成不可预测的大额惊喜。
必然爆发层 Must-Hit 隐藏爆点强制释放 32%-48% 奖池。 消除长期干等,完成喂池到爆池的闭环。

2.2 隐藏与独立

  • 公共奖池状态、爆点和当前周期不对客户端展示。
  • S Fund 与 J Fund 独立 roll小奖层 Miss 不影响大奖层触发。
  • 每次送礼都先形成完整开奖事实,再由表现层展示结果。

2.3 平台零风险

  • 每笔送礼先扣平台抽水。
  • J Fund payout 只能按比例释放,并受留底、单次上限和风控上限约束。
  • 奖池余额不足时不能透支,必须降级为可支付结果或 Miss。

3. 资金流与数学模型

每送 100 金单位礼物,资金拆分如下:

去向 金额 占比
平台抽水 22 金 22%
S Fund 小奖反馈 28 金 28%
J Fund 隐藏奖池 50 金 50%

长期口径:

  • 平台固定收益22 金。
  • S Fund 期望返还:约 22.84 金,利用率约 81.6%。
  • J Fund payout 长期受控在总贡献 50% 以内,依赖分段释放比例、必爆上限和留底。
  • 玩家侧综合期望返还约为 75.84 金,符合社交礼物玩法的健康区间。

4. 开奖算法

4.1 S Fund 小奖反馈层

S Fund 使用 Alias Method 做 O(1) 采样。金额使用连续均匀分布,避免固定值被用户感知为机械规律。

Tier 概率 返还金额 期望贡献
Miss 42% 0 0
小回血 32% Uniform[8, 18] 4.16
中回血 16% Uniform[25, 45] 5.60
好奖 7% Uniform[60, 120] 6.30
大回血 3% Uniform[150, 280] 6.45

期望值:

E[S] = 0.32 * 13 + 0.16 * 35 + 0.07 * 90 + 0.03 * 215
     = 22.51

说明:原始方案中的 22.84 与表格均值直接计算不完全一致。按当前表格区间中点计算是 22.51。如果产品口径必须锁定 22.84,需要微调某一档金额区间或概率后再进入实现。

4.2 J Fund 基础隐藏奖池层

每次送礼原子增加 50 金到 J Fund。J Fund 与 S Fund 独立开奖。

基础触发:

  • 触发概率1.0%。
  • 获奖金额:win_J = J * r
  • 释放后:J_new = J - win_J,不清空奖池,保留自然底池。

释放比例按当前 J Fund 规模分段:

J Fund 当前规模 r 范围
J < 200000 Uniform[0.05, 0.10]
200000 <= J < 500000 Uniform[0.08, 0.15]
J >= 500000 Uniform[0.12, 0.22]

4.3 Must-Hit 必爆机制

周期初始化:

T = J_current + Uniform[280000, 720000]

每次送礼按顺序执行:

  1. J = J + 50
  2. 如果 J >= T 且当前周期未触发,强制触发超级爆池。
  3. 超级爆池金额为 win_J = J * r,其中 r = Uniform[0.32, 0.48]
  4. 释放后 J_new = J - win_J,通常保留 52%-68% 底池。
  5. 新周期爆点为 T_new = J_new + Uniform[300000, 800000]

参数依据:

  • 28 万到 72 万爆点贡献区间用于覆盖热门房间约 40-120 分钟的心理窗口。
  • 32%-48% 强制释放比例保证单次大奖冲击力,同时保留底池继续滚动。

5. 完整开奖流程

on_lucky_gift(user_id, amount = 100):
  platform_rake += 22
  s_fund += 28

  j_before = j_fund
  j_fund += 50

  s_win = roll_s_fund()
  credit_user(user_id, s_win)

  j_win = 0
  forced = false

  if j_fund >= current_trigger and current_cycle_not_triggered:
    r = uniform(0.32, 0.48)
    j_win = j_fund * r
    j_win = apply_jackpot_caps(j_win, j_fund)
    j_fund -= j_win
    current_trigger = j_fund + uniform(300000, 800000)
    forced = true
  else if random() < 0.01:
    r = get_r_by_pool_size(j_fund)
    j_win = j_fund * r
    j_win = apply_jackpot_caps(j_win, j_fund)
    j_fund -= j_win

  if j_win > 0:
    credit_user(user_id, j_win)

  write_audit_log(...)

必须注意:真实实现不能在抽奖事务里直接调用钱包入账。应先写开奖事实和 outbox再由 worker 幂等发奖,避免数据库事务和外部 RPC 混在一起。

6. 安全、公平与风控规则

规则 要求
单次上限 win_J = min(win_J, j_fund * 0.48, 500000)
个人累计上限 可选日/周 jackpot 累计封顶,防止洗钱和异常套利。
内部账号隔离 internal、bot、host 测试账号只能走 S Fund 和模拟 J Fund不真实消耗 J Fund。
随机性 使用密码学安全 RNG每次记录 seed 或可验证随机材料,支持重放。
并发安全 J Fund 更新必须在数据库事务内完成,使用行锁、版本号或分布式锁防止并发透支。
初始种子 新周期可注入 8 万到 15 万启动 J Fund计入营销成本或后期回收。
审计完整性 每笔记录 gift_id、user_id、room_id、j_before、j_after、s_win、j_win、forced_hit、random_seed、trigger、ts。

7. 参数配置与动态调优

7.1 推荐 v1.0 参数

参数 推荐值 调优方向
平台抽水 22% 不可低于 18%。
S Fund 贡献 28% 维持 E[S] 约 22.5-23.5。
J Fund 贡献 50% 核心滚雪球资金来源。
基础池奖概率 1.0% 可在 0.6%-1.5% 调整。
必爆释放比例 Uniform[0.32, 0.48] 越高越激进,越低越耐久。
初始爆点范围 Uniform[280000, 720000] 礼物量越大,范围可越大。
新周期爆点范围 Uniform[300000, 800000] 大奖后重建周期,避免连爆过密。

7.2 动态微调

当 J Fund 过大时,可以轻微抬高基础大奖概率:

p_base = 0.01 + min(0.004, (J - 500000) / 75000000)

动态调参必须写入规则版本或配置变更记录,不能只改运行内存,否则无法审计和复盘。

8. 预期效果与 KPI

维度 预期
用户行为 高频小奖维持发送频率,稀有大奖和必爆大奖制造传播峰值。
经济指标 平台抽水稳定J Fund 不透支,大额释放后仍有底池恢复能力。
风险指标 单用户单次/累计上限、内部账号隔离、完整审计降低套利和质疑。
长期循环 数学上保证喂池后一定爆发,形成持续正反馈循环。

9. 技术实施建议

9.1 后端落地顺序

  1. 先实现资金原子更新、J Fund 周期状态、开奖事实和完整审计日志。
  2. 再接入 outbox worker由钱包服务幂等入账。
  3. 最后接入房间 IM、区域播报、后台配置、后台查询和监控告警。

9.2 服务边界

服务 职责
room-service 只负责送礼主链路、房间状态、Room Cell 和房间 outbox不拥有奖池。
activity-service 拥有幸运礼物规则、S Fund、J Fund、开奖事实、风控和发奖 outbox。
wallet-service 负责送礼扣费和幸运礼物返奖入账,保证幂等账务。
statistics-service 只消费事件写聚合表,不回查 owner service 明细表。
server/admin 提供参数配置、规则版本、开奖明细和统计查询入口。

9.3 必须支持热更新

以下参数需要后台配置并落规则版本:

  • 平台抽水比例。
  • S Fund 分布、概率和金额区间。
  • J Fund 贡献比例。
  • 基础大奖概率和分段释放比例。
  • Must-Hit 爆点范围和释放比例。
  • 单次、单用户、设备、房间、主播风控上限。
  • 内部账号和机器人隔离规则。

9.4 监控告警

  • J Fund 余额异常波动。
  • 实际 win rate 与配置概率长期偏离。
  • 单用户、单设备、单房间大额中奖集中。
  • outbox 发奖积压或失败。
  • 钱包返奖幂等冲突。
  • 必爆周期长时间未重置或重复触发。

9.5 合规

上线前需要法务确认虚拟礼物概率玩法边界。客户端可以公开必要规则说明,但不能暴露隐藏奖池余额、当前爆点和触发进度。

10. 审计日志字段

每笔开奖至少记录:

字段 说明
gift_id 本次送礼或抽奖唯一 ID。
command_id 幂等命令 ID重试必须复用。
user_id 送礼用户。
room_id 房间 ID。
target_user_id 收礼用户。
amount 本次礼物真实扣费金额。
s_before / s_after S Fund 变更快照。
j_before / j_after J Fund 变更快照。
s_win S Fund 中奖金额。
j_win J Fund 中奖金额。
forced_hit 是否 Must-Hit 强制触发。
trigger_before / trigger_after 周期爆点变更。
random_seed 可验证随机材料。
random_rolls 本次所有随机 roll 明细。
status pending、granted、failed。
created_at_ms UTC epoch milliseconds。

11. 当前实现差距

本方案与当前仓库中的幸运礼物 v2 配置化 RTP 奖档模型不是同一个口径。进入技术实现前,需要明确是否替换现有 v2 主链路,或作为新 pool_id / 新规则版本并行上线。

必须确认的差距:

  • 当前实现按 pool_id、规则版本、阶段奖档和 RTP 窗口抽奖;新方案按 S Fund、J Fund 和 Must-Hit 周期抽奖。
  • 当前实现已有三层基础奖池和风控计数;新方案需要新增隐藏 J Fund 周期状态和强制爆点。
  • 当前实现 worker 已支持异步发奖;新方案必须复用这个账务边界,不能把伪代码中的 credit_user 做成事务内 RPC。
  • 当前统计只能消费事实事件写聚合表;新方案的 S/J payout 需要补充事件字段或独立统计读模型。

12. 版本迭代计划

版本 内容
v1.1 增加多档幸运礼物,高价礼物贡献更高 J Fund 比例。
v1.2 按房间活跃度自适应 Must-Hit 爆点范围。
v1.3 可选展示个人累计 jackpot 贡献,默认仍保持极简模式。