Bootstrap

如何设计微信抢红包的算法

          过年的时候大家都会在微信群中抢红包,抢的不亦乐乎,抢的多的时候惊喜大笑,抢的少的时候后悔重来,但是抢红包大家每个人抢的多少都是公平的吗?每次抢红包都是随机的吗?

在这里插入图片描述

今天就来看看这个抢红包算法到底怎么实现。抢红包必须要满足这么几个规则:

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元

        努力为大家分享更多通俗易懂有趣的python知识哦!欢迎大家关注我的微信公众号:宁仔说python,让学习变得开心有趣

在这里插入图片描述

;