发手气红包算法
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
轉載于:https://www.cnblogs.com/toby2chen/p/5179776.html
總結
- 上一篇: 做梦梦到被水淹了是什么意思
- 下一篇: 梦到发大财什么意思