过年的时候大家都会在微信群中抢红包,抢的不亦乐乎,抢的多的时候惊喜大笑,抢的少的时候后悔重来,但是抢红包大家每个人抢的多少都是公平的吗?每次抢红包都是随机的吗?
今天就来看看这个抢红包算法到底怎么实现。抢红包必须要满足这么几个规则:
1.所有人 抢到的金额之和要等于红包金额
2.每个人都会抢到钱
3. 要保证红包拆分的金额尽可能分布均匀,不能一个人抢了99块钱,另一个抢了1块钱,那玩个锤子呀
这里我们只谈算法,不管高并发会引起的一些问题,每个人领红包的金额不能在领的时候开始计算,必须计算好每个红包拆出的金额,并把他们放在一个队列里,用户要在队列里找到属于自己的那一份。
如何保证每个人抢到的红包金额平均一些呢,这里用到二倍均值法:假设剩余红包金额为m元,剩余人数为n,那么有如下公式:
每次抢到的金额 = 随机区间[0.01,m/n*2-0.01]元
这个公式,保证了每次随机金额的平均值都是相等的,不会因为抢红包的先后顺序而造成不公平。
代码:
import random
def divide_red_package(total_amount,total_people_num):
amount_list = []
rest_amount = total_amount
rest_people_num = total_people_num
for i in range(0,total_people_num-1):
amount = random.randint(1,int(rest_amount/rest_people_num*2)-1)
rest_amount -= amount
rest_people_num -= 1
amount_list.append(amount)
amount_list.append(rest_amount)
return amount_list
my_amount_list = divide_red_package(100, 6)
for user,my_amount in enumerate(my_amount_list):
print(f"第{user+1}个人抢到{my_amount}元")
结果:
第1个人抢到3元
第2个人抢到16元
第3个人抢到5元
第4个人抢到9元
第5个人抢到35元
第6个人抢到32元