SWE / HM · System Design

TikTok 跨国家抢券:怎样让每个人获券概率相同?

把公平定义为报名用户的等概率抽样,区分全球窗口报名、库存发放与先到先得的网络优势。

题目重点:把公平定义为报名用户的等概率抽样,区分全球窗口报名、库存发放与先到先得的网络优势。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 本文合同:报名窗口内每个合格唯一用户最多一票,N人报名、K张券,从N人中无放回均匀抽K人。
  • 资格/身份验证和用户唯一性的定义需要业务提供;一人多个账号会改变按人的公平,不能靠随机数自动解决。
  • 公平针对被接受的合格报名者,网络分区导致完全无法报名属于可达性问题;截止宽限与补偿政策需先约定。

解题路线

  1. 先问要“先到先得”还是“每人等概率”。全球不同延迟下按服务端最早到达发券会偏向低延迟地区,不能同时保证其与均匀抽样等价。本文用窗口报名、窗口关闭后抽签满足明确概率目标。
  2. 各region接受报名并按(campaign,user_id)去重,记录资格版本、服务端接收时间和报名状态。关闭窗口前按水位汇总或共识提交确定唯一候选集,不能某region遗漏时仍宣称覆盖所有人。
  3. 固定候选集后用可信随机种子给每用户生成独立随机排序键,取最小K。连续理想随机键无并列时每个用户对称,获券概率K/N;实现有限bit键需声明碰撞重抽或独立随机tie-break。
  4. 报名重试不能给新随机票,幂等唯一用户键绑定同一候选。抽签重试必须读取同一个已经冻结的种子/名单版本,不能因任务失败重抽让运营挑选自己喜欢的结果。
  5. 库存发券在事务中把K个winner与券状态持久化,(campaign,user_id)唯一;通知通过outbox重试。通知失败不等于中奖失败,领取到期释放券是否重新抽候补需确定政策。
  6. 每region固定同数量配额不会保持每人公平:100人地区10券概率10%,1000人地区10券概率1%。按报名数配置配额仍要处理取整和随机分配;全球抽样最容易说明对称性,但要求名单及时可用。
  7. 验收分数学机制、实现偏差和用户可达性:去重结果、重试不变、地域条件获券率置信区间、截止时延、机器人多账号和审计可复现。一次小样本地域比例不同不能自动证明随机算法有偏。

手动走一遍

两个国家合计N=1000名合格报名者、K=100张券,每人目标概率10%。某国200人期望20人中奖,但实际可能17或24,不要求恰好20;强制固定20又涉及另一分层抽样合同。中奖写库成功但通知失败时只重发通知,不新增券。

规模与取舍

全量随机键排序O(N log N),维护大小K堆O(N log K)、O(K)工作空间;报名去重仍需O(N)记录。多区汇总网络O(N)候选信息或更复杂分布式抽样,发券O(K)。

易错点与追问

容易失分的边界

  • 用请求次数作为票数。
  • 固定每区相同配额称为每人公平。
  • 客户端时间决定截止资格。
  • 重试重新抽签。
  • 随机机制掩盖资格/可达性偏差。

继续深挖

  • 必须即时告知中奖时如何定另一公平合同?
  • 怎样公开可验证的随机种子又防操纵?
  • 网络分区时延期还是关闭?
  • 候补替补怎样保持概率与可追溯性?
✓已复制微信号!