接了老板一个需求,做一个类似微信随机红包的功能,具体需求如下:
- 用户将自己的积分包入红包中,填写积分总数和红包个数,要求都为整数;
- 将红包发送到微信群中,用户抢红包,抢到的红包数量随机,精确到小数点2位;
整个需求相对来说比较简单,红包填写表单+微信分享+队列抢红包+红包随机算法,这篇文章主要介绍一下红包随机算法。
以前光只顾抢微信红包了,没有仔细思考过微信随机红包发放算法,这次接到这个需求后,对微信红包仔细研究了一番,发现以下规律:
- 红包金额从小到大呈现正态分布。
小红包和大红包占少数,大部分人抢到的都是不大不小的红包。 - 最大红包和最小红包出现的位置随机。
了解了微信随机红包的呈现规律后,自己的红包算法就比较好完成了,核心使用random随机函数。
Python代码如下:
import random
"""
amount 积分总数
num 红包个数
"""
def randomRedPackets(amount, num):
minMoney = 100 #一个红包中最小的积分数
totleMoney = amount * 100 #精确2位小数,统一扩大100倍
safeMoney = 0 #每个红包的安全上线
resdata = []
for x in range(1,num+1):
tmpMul = 1 if((num - x) // 2 == 0) else (num - x) // 2
safeMoney = (totleMoney - (num - x) * minMoney) // tmpMul #随机安全上限
if x != num:
money = random.randint(minMoney,safeMoney)
totleMoney -= money
else:
money = totleMoney
resdata.append(money/100)
print(resdata)
每个红包500积分,分8个包,运行100次,统计结果如下图所示:

网友评论