有个初学 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,交流学习哦!