二倍均值算法怎么保证红包金额不多发,少发

来源:2-4 红包算法概述

Echo鑫

2019-05-13

老师,我看着算法,是在最低的min金额上,进行二倍均值 以内的随机取值进行相加,得到随机后的金额,那这如何保证,随机金额分配完后,总金额数恰好等于所发红包的金额数呢,会不会造成多发了,或者没发完的情况?

还是,二倍均值只是确保金额的最大值,金额的超买超卖是要根据后续业务代码来控制?

写回答

2回答

枫荇

2019-05-13

@Echo鑫 同学,您好!

  • “会不会造成多发了”的问题,是通过最大可用金额来避免的,最大可用金额=剩余金额-剩余数量*最小金额,这样就预留了剩余数量个数的最小金额,最坏的情况下,每次都随机到了拼均数的2倍,也不会造成无可用金额可用的情况,比如红包总金额为9元,3个红包,最小金额为1分钱,也就是0.01,那么:

    1. 第一次:最大可用金额=9-3*0.01=8.97元为最大可用金额,平均值为2.99,那么随机数为0~2.99,可获得的金额为0.01~5.99,假如获得5.99,则剩余9-5.99=3.01元,2个红包

    2. 第二次:最大可用金额=3.01-2*0.01=2.99,平均值为1.49,那么随机数为0~1.49,可获得的金额为0.01~2.99,假如获得2.99,则剩余3.01-2.99=0.02元,那么剩余0.02,1个红包

    3. 最后一个无需计算,直接返回剩余的0.02即可

    4. 红包序列是:5.99,2.99,0.02,总和=9

    5. 所以通过计算最大可用金额就可以避免“多发了”的问题。

  • “没发完的情况”,从上面的例子中已经知道,最后一个红包是不计算的,直接返回剩余的金额,也就是刚好发完,就不存在“没发完的情况”。

  • 所以金额的超买超卖的问题是通过“最大可用金额”和最后直接返回余额来避免的。

另一个超卖的问题,属于库存扣减的问题正如@远芳同学的回答,通过乐观锁+无符号整形字段来约束和避免的。

1
1
Echo鑫
非常感谢!
2019-05-13
共1条回复

远芳墨

2019-05-13

二倍均值算法是保证了每次随机金额的平均值是相等的。 超卖问题通道乐观锁和无符号字段来约束

1
0

仿微信抢红包 Golang实战多版本抢红包系统

Golang红包系统单体版+并发版+分布式+微服务版,四大金装版、超值必修课

582 学习 · 159 问题

查看课程