天天看點

随機紅包生成算法-python實作

搶紅包那麼開心,那你知道紅包随機算法是怎麼樣的嗎?

我模拟寫了一個定額随機紅包生成算法,如下。

  • 輸入:
    • 紅包總額,total
    • 份數,num
    • 調控參數(調控紅包最平均差,預設為2)
  • 限制:
    • 每份最少有1分錢,即0.01
    • 份數需為正整數
    • 紅包總額 >= 份數×0.01
  • 輸出
    • 随機紅包序列,序列長度等于紅包份數
    • 運氣王,即紅包數額最大的一份
# -*- coding: cp936 -*-


# 思路:先随機出來m個數,然後平均分成m個數字隻和的份數,然後将錢平均分給m個人#
import random

def checkparam(total,num):
    if(type(num) != type()):
        print "num must be Integer";
        return False;
    if(num < ):
        print "num must be Positive Integer";
        return False;
    return True;

def roll(total,num,cond):
    print "===紅包算法研究程式==="
    print "共",total,"元錢。分",num,"份。條件參數為:",cond
    total *= 
    if(checkparam(total,num)):
        p = []
        average = total/num
##        print "前置平均數",average
        pre = []
        allpre = 
        for count in range(,num):
            tp = random.randint(,**cond)
            pre.append(tp)
            allpre += tp
##        print "預備随機序列",pre,len(pre)
##        print "預備總數",allpre
        onepre = round(total/allpre,cond)
##        
##        print "預備單份額",onepre
##        print "預備總金額",onepre * allpre
        print '-------'
        alltp = 
        for m in range(,len(pre)-):
            tp = int(onepre*pre[m])
            if (==tp):
                tp = 
            alltp += tp
            p.append(tp/)
        last = total-alltp
        p.append(last/)
        alltp += last
        #p.sort()
        #sorted(p)[0]
        print "運氣王:",sorted(p)[num-]#,p[num-1]
        #random.shuffle(p)
        print "紅包序列",p,len(p)
        print "總共發出",alltp/

        #random.shuffle(p)      #打亂序列


#總金額,份數,調控參數(調控平均差)
roll(,,)
           

下面為實際運作效果:

随機紅包生成算法-python實作

算法思路:

  1. 生成num個随機數,存入随機數清單。num為紅包份數,随機數的範圍由調控參數決定,調控參數為2,則表示随機數範圍為1-10**2 (10的2次方)。
  2. 将n個随機數相加,得到總和pretotal。
  3. 用紅包金額除以随機數總和,得到平均數。average = total / pretoal。
  4. 用随機數清單中的前num-1個随機數分别乘以平均數,得到就是随機紅包金額,最後剩下的金額就是第num個紅包的金額。
  5. 處理資料過小的問題,為了保證最小的金額為0.01元,在相乘的環節可能因為浮點數取整,得到為0的結果,那麼就将此資料置為最小金額。