高校门户网站源码,网站建设及运营岗位要求,h5页面制作效果图,广西桂林天气lowest0.01元#xff0c;最小金额 操作是整数#xff0c;最小人民币单位是分#xff0c;所以有2位小数#xff0c;最少是0.01元 发金额totalBill 发n人#xff0c;就取1到100的随机数n个 为了提高精度#xff0c;把金额放大100倍 totalAmounttotalBill*100 n个人各取的随…lowest0.01元最小金额 操作是整数最小人民币单位是分所以有2位小数最少是0.01元 发金额totalBill 发n人就取1到100的随机数n个 为了提高精度把金额放大100倍 totalAmounttotalBill*100 n个人各取的随机数累加得到总份量用总发红金额totalAmount去除总份量得到 每一份的金额 perAmounttotalAmount/n perAmount 采用四舍五入保留2位小数 开始发红包 若n个人有人的随机数不幸取到0不能给0元否则会骂人的给最小数lowest 0.01元 其它是 perBillpernum*perAmout/100 发到倒数第二个人最后一个人不能按照公式发要总数totalBill-已发金额原因是上面每份金额perAmount 保留两位小数时采用四舍五入,丢失了精度 举例说明6元发给3个人 金额放大100倍提高精表 6*100600 从0到100取3个随数如 20 50 60 每份金额 600/(205060)4.615384615384615 这时为了计算更快保留两位小数 4.62损失了精度最后一个人发红包时算法要注意 第一个人得到 (4.62*20)92.4 取整数 92缩小100回归正常倍数 92/1000.92元第二个人得到 (4.62*50)231 取整数 231缩小100回归正常倍数 231/1002.31元第三个人得到 6 -0.922.312.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 (0tp): 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