最近公司产品上线一个类似于微信抢红包功能,需要实现红包金额的随机分配算法。
基本约束:
- 发放红包时,每个人所能得到金额范围[1,20000],单位是分。
- 最后一个人,获得剩余全部金额。
- 机会均等,获得金额的多少与顺序无关。
之前,微信上线发红包功能时,各方大神对此进行深度解读,知乎,infoQ各大网站,也有相关专家的实现方案。
一个比较通用的方案是:二倍均值法。能保证各个人所得金额机会均等,但是delta值是相对固定的,手气最佳者也不过是二倍均值。
我们采用的是基于均值的正态分布概率,MIN=1,MAX=20000,当前均值U,本次金额X,本次min(假如后继序列都取MAX时,本次取值),本次max(假如后继序列都取MIN时,本次取值);其中MIN和本次min,小小取较大,MAX与本次max,大大取较小,作为本次金额的上下限;最后一个获取剩余所有。
本次取值满足[1,20000],同时保证后续取值满足[1,20000],根据数学归纳法得知,所有取值都满足[1,20000]。
为增强反差,可以调整正态分布函数的标准差取值,使得取值的最低和最高反差较大,提供更好的趣味性。
网友评论