# 幸运礼物 · 必爆隐藏奖池产品方案(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 | 期望值: ```text 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 必爆机制 周期初始化: ```text 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. 完整开奖流程 ```text 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 过大时,可以轻微抬高基础大奖概率: ```text 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 贡献,默认仍保持极简模式。 |