最近在研究红包生成算法,通过查阅资料和个人测试,现总结如下:
(1)红包数值是随机的,应该近似服从正态分布,即大部分红包钱数在平均值附近,小红包和大红包出现的概率都相对较低。
(2)每份红包数额是有上下限的,所以是个截尾正态分布。
(3)利用Box-Muller变换产生正态分布随机数。
事实上,我们可以通过反函数、中心极限定理、Box-Muller变换、Ziggurat算法等方法来获取正态分布随机数,但综合考虑,Box-Muller变换的处理效率和逻辑复杂都是最符合用来做红包分配算法的,下面就来看看吧。
Box-Muller 变换
(https://en.wikipedia.org/wiki/Box-Muller_transform)
基本思想是:要得到服从正态分布的随机数,先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。
如果在 (0,1] 值域内有两个独立的随机数字 U1 和 U2,可以使用以下两个等式中的任一个算出一个正态分布的随机数字 Z:
Z = R * cos( θ )
或
Z = R * sin( θ )
其中
R = sqrt(-2 * ln(U2))
θ = 2 * π * U1
正态值 Z 是服从标准正态分布的,即期望为 0 ,标准差为1 ,通过X = m + (Z * sd)可以将 Z 映射到一个平均值为 m、标准偏差为 sd