实现了以下两种抢红包方法:双平均法和线段切割法。
设红包剩余金额为M,剩余人数为N,则有如下公式:每次抢到的金额=随机(0,M/N * 2)。
这个公式保证了每个随机金额的平均值是相等的,不会因为抢红包的顺序而不公平。
举个栗子:
假设有10人,红包总额为100元。
100/10 * 2 = 20,所以第一个人的随机范围是(0,20),一般人能抢到10元。假设第一个人随机达到10元,那么剩余金额为100-10 = 90元。
90/9 * 2 = 20,那么第二个人的随机区间也是(0,20),一般人能抢到10元。假设第二个人随机达到10元,那么剩余金额为90-10 = 80元。
80/8X2 = 20,那么第三人的随机范围也是(0,20),一般人能抢到10元。
以此类推,除了最后一次,每个随机区间的平均值是相等的。
什么是线切割?我们可以把红包总额想象成一条长线段,每个人抢到的金额就是这条主线段分割出来的若干子线段。
如何确定每个子段的长度?是由“切点”决定的。N个人一起抢红包,需要确定N-1个切割点。所以我们需要做N-1次随机运算来确定N-1个切割点。随机范围区间为(1,m)。
当所有切割点都确定后,子段的长度也就确定了。这样大家来抢红包的时候,只需要依次领取相当于段子长度的红包金额即可。
这就是线段切割的思想。这里需要注意以下两点:
参考漫画:抢红包算法怎么实现?》