有个初学python的小伙伴,在群里问我关于实现抢红包的算法的问题,于是就有了以下对话
这里,这位同学的思路是这样的:
每次抢到的金额 = 随机区间 ( 0.01, 剩余金额 )
为什么我这样说呢?我们来举个栗子:
假设10个人抢100元的红包:
第一个人随机的范围是(0.01,100),平均是50元,假如第一个人抢到了50元,
第二个人随机的范围是(0.01,50),平均是25元,如果这个人抢到了25元,那往下推的话,就会发现第三个人的范围是(0.01,25)……
越往后金额越低,我们写段代码来看看
我们的思路是这样的:
剩余红包金额为M,剩余人数为N,那么有如下公式:
每次抢到的金额 = 随机区间 (0.01, M / N X 2)
这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。
举个栗子:
假设有10个人,红包总额100元。
100/10X2 = 20, 所以第一个人的随机范围是(0.01,20 ),平均可以抢到10元。
假设第一个人随机到10元,那么剩余金额是100-10 =90 元。
90/9X2 = 20, 所以第二个人的随机范围同样是(0.01,20 ),平均可以抢到10元。
假设第二个人随机到10元,那么剩余金额是90-10 =80 元。
80/8X2 = 20, 所以第三个人的随机范围同样是(0.01,20 ),平均可以抢到10元。
以此类推,每一次随机范围的均值是相等的。
我们来写代码实现一下:
大致思路如下:
先将红包m分成n份,然后随机n次取出红包
这里有2个地方需要注意:
出现重复的处理办法
尽可能的降低时间和空间的复杂度
这里就不写代码了,大家有兴趣可以去研究下哦!
这里要说明下,微信或者QQ的红包规则很可能就是最后一种方式,当然没有见过代码也说不准,大家有兴趣可以找找相关资料的!
欢迎大家来和我一起研究算法,研究python,交流学习哦!
领取专属 10元无门槛券
私享最新 技术干货