发手气红包算法

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)

以上是关于发手气红包算法的主要内容,如果未能解决你的问题,请参考以下文章

拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编

拼手气红包算法,保证金额不会随前后顺序进入而变化,微信的红包生成算法改编

小案例--python编写设置拼手气红包模块

java 实现仿照微信抢红包算法,实测结果基本和微信吻合,附demo

刷题面筋-测开-微信发红包测试用例

手气红包随即分发