zoukankan      html  css  js  c++  java
  • 发手气红包算法

    lowest=0.01元,最小金额

    操作是整数,最小人民币单位是分,所以有2位小数,最少是0.01元

    发金额totalBill

    发n人,就取1到100的随机数n个

    为了提高精度,把金额放大100倍  totalAmount=totalBill*100

    n个人各取的随机数累加得到总份量,用总发红金额totalAmount去除总份量,得到

    每一份的金额 perAmount=totalAmount/n    perAmount 采用四舍五入,保留2位小数

    开始发红包 若n个人,有人的随机数不幸取到0,不能给0元,否则会骂人的,给最小数lowest 0.01元

    其它是 perBill=pernum*perAmout/100

    发到倒数第二个人,最后一个人不能按照公式发,要总数totalBill-已发金额,(原因是上面每份金额
    perAmount 保留两位小数时,采用四舍五入,丢失了精度)

    举例说明:
    6元发给3个人

    金额放大100倍提高精表 6*100=600

    从0到100取3个随数,如 20 50 60

    每份金额 600/(20+50+60)=4.615384615384615  这时为了计算更快,保留两位小数 4.62
    损失了精度,最后一个人发红包时算法要注意

    第一个人得到 (4.62*20)=92.4 取整数 92,缩小100回归正常倍数 92/100=0.92元

    第二个人得到 (4.62*50)=231 取整数 231,缩小100回归正常倍数 231/100=2.31元

    第三个人得到 6 -(0.92+2.31)=2.77元

    附上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

  • 相关阅读:
    java 平面上最近两个点之间的距离
    java 选择排序
    java 复制字串算法
    mysql数据库的导入导出
    010editor安装包
    切换使用phpstudy的mysql和本机自带的mysql
    vmware安装kali
    win10,python安装mysql
    php变量等入门
    Wampserver 2.5安装
  • 原文地址:https://www.cnblogs.com/toby2chen/p/5179776.html
Copyright © 2011-2022 走看看