非技术版:这套算法到底是什么
把它理解成一个“AI 信号预算返还系统”:用户玩游戏产生打码和输赢,系统把可回补的净输资金拆成预算,再通过 AI 信号分批返还给部分用户。
只看三件事:用户在哪个档位队列、净输资金怎么分、信号发给谁。看完就能知道算法为什么能让用户继续玩。
后半段继续讲状态字段、队列流转、评估日志、统计口径和测试用例。
术语 1:档位队列
T0-T16 只表示用户按打码量排队的位置,是“人在哪里”,不是钱。
术语 2:净输资金
用户新增实际净输形成可拆分金额,是“钱从哪里来”,不再叫净输池。
术语 3:AI 信号池
只表示正在给信号的临时展示区,展示来源档位和返还金额。
非技术版:6 步看懂怎么运作
这张图就是会议里最适合先讲的一页。少讲公式,多讲“人怎么走、净输资金怎么分、信号怎么发”。
净输资金不是无限发钱,而是从模拟积分的新增实际净输里拆出信号预算,再用这部分预算给信号返还。
非技术版:结果怎么看,优缺点是什么
这部分用来回答团队最关心的问题:用户会看到什么、平台得到什么、哪里有风险。
优点
注意点
技术版本:算法总览和关键口径
这里开始给研发、测试和数据同学看。重点是状态流转、预算口径、抽样口径和审计口径保持一致。
运行主流程:7 个节点讲完整个算法
从左到右看:先产生用户周期数据,再进入档位队列,再评估本批净输资金和预算,最后发信号或继续累积。
记录下注额、派彩、余额、连续输赢、累计总打码。
周期打码量和周期净输增长,净输只取正值。
T0 是小于首档;T1 是首档到下一档之间;后续按相邻门槛区间升档。
筛出本档未评估候选用户,汇总新增实际净输。
平台留存、活动预算、信号返还分别累计展示。
15%-25% 加权随机抽样,从信号预算中按幂函数奖励分布返还:多数小额,少数高额。
中信号进信号池后清零;未中留在当前档位队列,等达到下一档。
pool_tier = 0 for T0, otherwise highest_reached_tier
available = max(0, net_loss - accounted_net_loss)
tier_pool -> signal_pool -> reset_cycle -> T0
reset cycle fields, keep lifetime stats
核心规则:团队沟通时必须保持一致的口径
这几条是最容易讲错、实现错、测试漏的地方。只要这些不变,页面、后端和数据报表就能对齐。
| 规则 | 正确口径 | 错了会怎样 |
|---|---|---|
| 累计入账净输 | 每次评估时,把本批候选用户的新增实际净输累加到历史总额。 | 如果用完整周期净输,会在 T1、T2、T3 重复算出虚高资金。 |
| 本批净输资金 | 当前档位中,尚未参与本档评估用户的 available_net_loss 总和。 | 如果包含已评用户,会让同一档位反复分钱。 |
| 未中奖用户 | 留在当前档位队列,标记 Tn已评;达到下一档后迁移。 | 如果错误回到 T0,会让高打码用户看起来掉档。 |
| 中奖用户 | 先进入信号池,展示来源档位和返还;动画结束后周期清零。 | 如果直接消失,团队看不懂信号来自哪个档位。 |
| RTP | 按派彩分布真实期望归一化,92% RTP 长期杀率接近 8%。 | 如果直接按 0.92 缩放,会导致真实杀率异常偏高。 |
gross_pool = sum(available_net_loss) platform = gross_pool * 0.35 activity = gross_pool * 0.15 signal_budget = gross_pool * 0.50
技术实现:拆成状态、队列、评估、结算四个模块
技术团队可以直接按这四块落后端服务、前端展示或模拟器逻辑。核心是事件驱动,所有可审计字段在评估时快照。
1. UserState 用户状态
- 周期字段:turnover、bet_total、payout_total、net_loss。
- 档位队列字段:pool_tier、evaluated_tier、accounted_net_loss。
- 保护字段:cooldown、missed_tiers、losing_streak、new_user_ticks。
- 历史字段:total_turnover、signal_count、signal_return_total。
2. TierPool 档位队列
- T1-T16 每档一个 Set 或队列表。
- 用户升档时从旧队列删除,再加入新队列。
- 只评估 pool_tier 等于当前档且 evaluated_tier 小于当前档的用户。
- 队列展示和分钱计算使用同一份状态,避免口径分裂。
3. Evaluation 档位评估
- 计算候选用户 available_net_loss。
- gross_pool 太小则跳过。
- 按 15%-25% 选出用户,保护用户权重更高。
- 用幂函数奖励分布把 signal_budget 分给被选用户。
4. SignalPool 信号池
- 被选用户从档位队列移出,进入信号池。
- 保存 signal_source_tier,用于展示 Tn信号。
- 动画期间不下注,不进入其他档位队列。
- 动画结束后执行 reset_user_cycle。
5. Stats 统计落账
- 发信号时写用户信号次数和返还总额。
- 按来源档位写去重用户数、信号次数、送出积分。
- 清零不清历史统计。
- 统计表应能从事件日志重放恢复。
6. Audit 审计日志
- 每次评估写 tier_id、candidate_count、selected_count。
- 写 gross_pool、拆分金额、参数快照和随机种子。
- 写 selected_user_ids、payouts、unselected_user_ids。
- 用于排查为什么某用户拿到或没拿到信号。
on_user_round(user, bet, payout):
if user.in_signal_pool:
process_signal_animation(user)
return
update_cycle(user, bet, payout)
reached_tier = highest_tier(user.cycle_turnover)
if reached_tier > user.evaluated_tier:
move_user_to_tier_pool(user, reached_tier)
evaluate_tier(tier):
queued = users where pool_tier == tier and evaluated_tier < tier
candidates = filter_eligible(queued)
gross_pool = sum(max(0, net_loss - accounted_net_loss))
if gross_pool < min_pool:
return
selected = weighted_sample(candidates, trigger_rate)
payouts = allocate_by_power_reward_curve(selected, gross_pool * signal_share)
for user in selected:
enter_signal_pool(user, payouts[user], tier)
write_stats(user, tier, payouts[user])
for user in candidates - selected:
user.evaluated_tier = tier
user.accounted_net_loss = max(user.accounted_net_loss, user.net_loss)
write_audit_log(tier, candidates, selected, gross_pool, payouts)
数据与审计:实现时至少要能查这三张表
测试、运营、技术排查问题时,最常用的问题是“为什么这个用户拿了信号”“这个档位发出去多少”“累计入账净输有没有重复算”。
| 表 / 日志 | 关键字段 | 用途 |
|---|---|---|
| user_cycle_state | user_id, cycle_turnover, net_loss, accounted_net_loss, pool_tier, evaluated_tier, signal_source_tier | 还原用户当前在哪个档位队列、是否已评估、还有多少新增净输可入账。 |
| signal_pool_event | event_id, user_id, source_tier, amount, band, entered_at, reset_at | 还原信号动画和清零过程,确认来源档位展示正确。 |
| tier_evaluation_log | tier_id, candidate_count, gross_pool, platform, activity, signal_budget, selected_user_ids, random_seed | 解释每一次档位评估、预算拆分和抽样结果。 |
| user_signal_stats | user_id, signal_count, signal_sources_by_tier, total_turnover, total_signal_return | 按用户看累计拿到几次信号、来自哪些档位、被返还多少。 |
| pool_signal_stats | tier_id, unique_signal_user_count, signal_count, total_signal_amount | 按档位看一共给几个用户发过信号、送出多少积分。 |
测试清单:测试同学按这些点验收
先测确定性,再测随机分布。单测保证口径不坏,集成测试保证档位队列流转正确,长跑测试保证 RTP、返还和统计没有漂移。
构造用户从 T1 打到 T2,断言 T1 队列删除该用户、T2 队列新增该用户,页面不重复展示。
用户 T1 未中后 accounted_net_loss 更新;进入 T2 时只把新增净输计入 gross_pool。
中奖用户先显示在信号池,source_tier 正确;动画结束后周期字段清零,历史统计保留。
未中奖用户显示 Tn已评,不重复参与本档抽样;达到下一档后迁移到下一档。
固定 gross_pool,断言 platform、activity、signal_budget 比例正确,累计展示使用绝对值和相对比例。
设置 RTP=92%,大量模拟后实际派彩率应接近 92%,短期波动可接受,长期不应偏到 64%。
发 N 次信号后,用户表 signal_count 之和应等于档位表 signal_count 之和。
无净输、低余额、新用户、冷却期、T16 深档、用户数很少、gross_pool 太小都要覆盖。
5 分钟讲解顺序:照这个讲,团队能对齐
适合开评审会时从上到下讲一遍,再跳到模拟器观察实时数据。