发手气红包算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发手气红包算法相关的知识,希望对你有一定的参考价值。
lowest=0.01元,最小金额
操作是整数,最小人民币单位是分,所以有2位小数,最少是0.01元
发n人,就取1到100的随机数n个
n个数相加得到总份量,用总发红金额total去除,得到每一份的金额 per=total/n
开始发红包 若n个数中不幸取到0,拿不能给0,给一个最小数lowest 0.01元
基它是 permount=pernum*per/100
发到倒数第二个,最后一个不能按照公式发,要总数total-已发金额,(原因是上每份金额
保留两位小数时,采用四舍五入)
举例说明:
6元发给3个人
从0到100取3个随数,如 20 50 60
每份金额 6/(20+50+60)=0.0461538461538462 这时为了计算更快,保留两位小数 0.05元
损失了精度,最后一个人算法要注意
第一个人得到 0.05*20=1元
第二个人得到 0.05*50=2.5元
第三个人得到 6-(1+2.5)=2.5元
附上python代码:
# -*- coding: utf-8 -*-
# 思路:先随机出来m个数,然后平均分成m个数字只和的份数,然后将钱平均分给m个人#
import random
def checkparam(total,num):
if(type(num) != type(1)):
print "num must be Integer";
return False;
if(num < 0):
print "num must be Positive Integer";
return False;
return True;
def roll(total,num,cond):
print "===红包算法研究程序==="
print "共",total,"元钱。分",num,"份。条件参数为:",cond
total *= 100
if(checkparam(total,num)):
p = []
average = total/num
## print "前置平均数",average
pre = []
allpre = 0.0
for count in range(0,num):
tp = random.randint(1,10**cond)
pre.append(tp)
allpre += tp
## print "预备随机序列",pre,len(pre)
## print "预备总数",allpre
onepre = round(total/allpre,cond)
##
## print "预备单份额",onepre
## print "预备总金额",onepre * allpre
print ‘-------‘
alltp = 0
for m in range(0,len(pre)-1):
tp = int(onepre*pre[m])
if (0==tp):
tp = 1
alltp += tp
p.append(tp/100.0)
last = total-alltp
p.append(last/100.0)
alltp += last
#p.sort()
#sorted(p)[0]
print "运气王:",sorted(p)[num-1]#,p[num-1]
#random.shuffle(p)
print "红包序列",p,len(p)
print "总共发出",alltp/100.0
[email protected]:~/tmp# vi sendMoney.py
# -*- coding: utf-8 -*-
# 思路:先随机出来m个数,然后平均分成m个数字只和的份数,然后将钱平均分给m个人#
import random
def checkparam(total,num):
if(type(num) != type(1)):
print "num must be Integer";
return False;
if(num < 0):
print "num must be Positive Integer";
return False;
return True;
def roll(total,num,cond):
print "===红包算法研究程序==="
print "共",total,"元钱。分",num,"份。条件参数为:",cond
total *= 100
if(checkparam(total,num)):
p = []
average = total/num
## print "前置平均数",average
pre = []
allpre = 0.0
for count in range(0,num):
tp = random.randint(1,10**cond)
pre.append(tp)
allpre += tp
## print "预备随机序列",pre,len(pre)
## print "预备总数",allpre
onepre = round(total/allpre,cond)
##
## print "预备单份额",onepre
## print "预备总金额",onepre * allpre
print ‘-------‘
alltp = 0
for m in range(0,len(pre)-1):
tp = int(onepre*pre[m])
if (0==tp):
tp = 1
alltp += tp
p.append(tp/100.0)
last = total-alltp
p.append(last/100.0)
alltp += last
#p.sort()
#sorted(p)[0]
print "运气王:",sorted(p)[num-1]#,p[num-1]
#random.shuffle(p)
print "红包序列",p,len(p)
print "总共发出",alltp/100.0
#random.shuffle(p) #打乱序列
#总金额,份数,调控参数(调控平均差)
roll(3,5,2)
以上是关于发手气红包算法的主要内容,如果未能解决你的问题,请参考以下文章
拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编
拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编