python 模拟发红包程序

Python 2018-01-20

程序源码:

# -*- 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 ========================#蔺光岭#


本文由 蔺光岭 创作,采用 知识共享署名 4.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论