程序源码:
# -*- coding: utf-8 -*-
# @Author : guangling_lin
# @Email : guangling_lin@aliyun.com
# @File : fahongbao.py
import random
def hongbao(total, num):
total = float(total) # 红包数
num = int(num) # 红包总额
min = 0.01 # 最小红包
if (num < 1):
return
if num == 1:
print "第%d个人拿到红包数为:%.2f" % (num, total)
return
i = 1
while (i < num):
# 过程解释:
# num=4,total=10
# i=1,1<4,10-0.03=9.97,k=1,if假,max=9.97/1=9.97,money=随机数(1,997),假设650,取余得到6.50,total=10-6.5=3.5
# total=3.5 i=2,2<4,max=3.5-0.01*(4-2)=3.5-0.02=3.48,k=0,k=2,max=3.48/2=1.24 money=(1,124),假设20,取余得到0.2,total=3.5-0.2=3.3
# total=3.3 i=3,3<4,max=3.3-0.01(4-3)=3.29,k=0,k=1,max=3.3,money=(1,330),假设130,取余得1.3,total=3.3-1.3=2
# total=2,i=4不小于num=4,退出while循环,将剩余的2元钱拿到自己手里,程序结束
# 保证即使一个红包是最大的了, 后面剩下的红包, 每个红包也不会小于最小值
max = total - min * (num - i)
k = int((num - i) / 2)
# 保证最后两个人拿的红包不超出剩余红包
if num - i <= 2:
k = num - i
# 最大的红包限定的平均线上下
max = max / k
# 保证每个红包大于最小值,又不会大于最大值
money = random.randint(int(min * 100), int(max * 100))
# 保留两位小数
money = float(money) / 100
total = total - money
print "第%d个人拿到红包数为:%.2f, 余额为: %.2f" % (i, money, total)
i += 1
print "第%d个人拿到红包数为:%.2f, 余额为: %.2f" % (i, total, 0.0) # 最后一个人拿走剩下的红包
if __name__ == '__main__':
total = raw_input('输入红包总金额:')
num = raw_input('输入发红包数量:')
try:
# 模拟2次
for i in range(2):
each = hongbao(total, num)
print each
except:
print 'Error'
测试结果:
输入红包总金额:88
输入发红包数量:8
第1个人拿到红包数为:1.78, 余额为: 86.22
第2个人拿到红包数为:18.98, 余额为: 67.24
第3个人拿到红包数为:0.51, 余额为: 66.73
第4个人拿到红包数为:1.31, 余额为: 65.42
第5个人拿到红包数为:34.13, 余额为: 31.29
第6个人拿到红包数为:12.56, 余额为: 18.73
第7个人拿到红包数为:10.01, 余额为: 8.72
第8个人拿到红包数为:8.72, 余额为: 0.00
None
第1个人拿到红包数为:24.33, 余额为: 63.67
第2个人拿到红包数为:16.01, 余额为: 47.66
第3个人拿到红包数为:11.43, 余额为: 36.23
第4个人拿到红包数为:8.19, 余额为: 28.04
第5个人拿到红包数为:5.85, 余额为: 22.19
第6个人拿到红包数为:7.05, 余额为: 15.14
第7个人拿到红包数为:10.09, 余额为: 5.05
第8个人拿到红包数为:5.05, 余额为: 0.00
None
每一个成功的背后都有无数个无人知晓的黑夜。
因为
夜晚,是超越对手的最佳时机。
===================== 码农1024 ========================#蔺光岭#
还不快抢沙发