设计微信红包的金额分配算法是一个非常经典的面试题,也是一个有趣的数学与工程结合的问题。 设计这个算法的核心目标有以下几点: 1. 随机性:每个人抢到的金额需要随机。 2. 总额匹配:所有人的金额加起来必须严格等于总金额。 3. 最小限制:每个人至少要抢到 0.01 元。 4. 公平性(心理上):虽然是随机,但不能让先抢的人把钱全抢光了,也不能让大部分人都只拿 0.01 元。 5. 性能与并发:微信红包的并发量极大,计算必须简单高效。 目前业界公认微信采用的是 “二倍均值法” (Double Mean Method)。 --- 1. 核心算法:二倍均值法 基本思路: 每次分配金额时,剩余金额为 $M$,剩余人数为 $N$。 那么,当前剩余的人均金额为 $M/N$。 算法规定,生成的随机金额范围是 $[0.01, \frac{M}{N} \times 2)$。 公式: $$ \text{本次抢到的金额} = \text{Random}(0.01, \frac{\text{剩余金额}}{\text{剩余人数}} \times 2) $$ 为什么要乘 2? 在数学上,在 $[0, K]$...