搶紅包那麼開心,那你知道紅包随機算法是怎麼樣的嗎?
我模拟寫了一個定額随機紅包生成算法,如下。
- 輸入:
- 紅包總額,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(,,)
下面為實際運作效果:

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