春节假期,你抢红包了吗?

春节假期里,大家肯定都抢过红包。虽然玩游戏是图个热闹,不在乎到底多少钱,但有时候抢出来的金额差别还挺大。你有没有想过,先动手和后动手抢红包,结果会不会不一样?系统给每个人分的钱是不是完全随机的呢?刚有抢红包的时候,算法确实是纯随机的。比如发个100元红包给10个人,第一个人能拿到的钱在0.01元到100元之间都有可能,平均值是50元。数学上叫这个“长期平均值”为数学期望。你可以想成给你一根绳子,闭着眼剪一刀,最可能从中间剪开。 举个例子吧,发100元给10个人。第一个人如果抢到了10元,剩下90元给后面的人。第二个轮到的时候,他能拿到的范围就变成了0.01到90元,平均值掉到了45元。剩下的钱越少,期望值就越低。先下手为强确实占便宜啊。 那该怎么办才能让大家觉得公平又有意思呢?这里就有一个叫“二倍均值法”的黄金法则来帮我们解决这个问题了。现在的抢红包算法都是基于这个原理来设计的。简单说就是给每个人设定一个上限:最少拿0.01元,最多不能超过剩余金额平均值的两倍。 我们继续用发100元给10个人来举例。第一个人最多只能拿20元(因为100除以10再乘以2就是20),所以他的钱范围在0.01到20元之间。按照最初的算法算下来,他的期望值其实是10元。 要是他运气差只拿了1块钱,那剩下99块钱分给剩下的9个人。这时候第二个该轮到的人上限就变成99除以9再乘以2,也就是22元。期望值还是稳定在11元左右。 就算第一个人手气爆棚拿走上限20元,那剩下80块钱也只有9个人分。第二个人的上限就变成80除以9再乘以2,大概是17.78元。他的期望值也稳定在8.89元左右。 你看,不管第一个人拿走多少块钱后面的人都不会有太大波动了。“二倍均值法”的好处就是把大家的平均运气给拉平了。 当然真正的算法还要考虑很多细节问题,比如最小金额限制、高并发下的系统稳定性等等。说到底不管红包有多大有多小,那种争抢带来的乐趣才是我们真正想要的啊!