用python实现的微信红包算法,有些地方还是没有搞明白,如果有人知道还请指教
算法精要
主要在于随机数的生成
#这一句是重点,不知道为什么
#如果比2.0小则前面的红包是小,后面大
#如果比2.0大则前面是大红包,后面是小红包
max = remainAmount / remainSize * 2.0
源代码
#! encoding:utf-8
import random
import math
def getMoney(remainAmount,remainSize):
if remainSize == 1:
money = round(remainAmount * 100) / 100
else:
min = 0.01
#这一句是重点,不知道为什么
#如果比2.0小则前面的红包是小,后面大
#如果比2.0大则前面是大红包,后面是小红包
max = remainAmount / remainSize * 2.0
#print remainAmount,remainSize,max
money = random.random() * max
money = money <= min and min or money
money = math.floor(money * 100) / 100;
return money
#模拟发放
def simulateRedPacket(amount,num):
remainSize = num
remainAmount = amount
#初始化数组
results = [0 for x in xrange(0,num)]
#模拟发红包
for x in xrange(0,num):
money = getMoney(remainAmount,remainSize)
remainSize -= 1
remainAmount -= money
results[x] = money
#计算发放总额
sum = 0
for x in results:
sum += x
if amount - sum > 0.01:
#发放结果
pass
print results
print ", ".join([" = ".join(["金额",str(amount)])," = ".join(["数量",str(num)])," = ".join(["已发放",str(sum)])," = ".join(["差额",str(amount - sum)])])
if __name__ == '__main__':
for x in xrange(1,2000):
#金额
amount = round(random.random() * 100) * 1000 / 100
#红包数量
num = random.randint(1,100)
simulateRedPacket(amount,num)