• python 微信红包生成器


    #红包生成思路
    #200 块钱 10个红包
    #
    0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的时候 保留2位小数 import random def red_pocket(money,num): money = money * 100 #把元 换算成分 ret = random.sample(range(1,money),num-1) #random.sample 要在列表中取值,所以要range一下,range(1,money)1是1分,再随机抽取9个数 ret.sort() # ***没有返回值*** # 对抽取的数进行排列 [3016, 8109, 12859, 13762, 14179, 14329, 15012, 17230, 19200] #在列表中插入 0 和200, 等会做减法算每一个红包的大小用 ret.insert(0,0) ret.append(money) # return ret [0, 2146, 2299, 2303, 5749, 8003, 8968, 14713, 17829, 19375, 20000] for i in range(len(ret)-1): gap = (ret[i+1] - ret[i])/100 #算出每一段的差值,再除以100 转换成单位元 yield gap # 分回一个生成器, 在抽红包之前就已经分好了,然后按照抽的顺序弹出红包金额 red_g = red_pocket(200,10) for i in red_g: print(i)
    #对生成器循环10次,查看金额的分配情况
    for j in range(10):
        red_g = red_pocket(200,10)
        lst = []
        for i in red_g:
            lst.append(i)
        print(lst)
    
    #结果: [
    8.8, 8.83, 55.25, 34.3, 7.5, 18.83, 25.88, 5.05, 5.44, 30.12] [25.83, 26.8, 15.77, 50.31, 1.86, 30.71, 2.73, 14.76, 29.07, 2.16] [2.22, 62.77, 2.76, 7.02, 2.7, 34.73, 7.72, 16.13, 21.74, 42.21] [20.62, 2.85, 13.56, 19.2, 35.54, 13.35, 15.78, 10.49, 67.04, 1.57] [23.94, 27.86, 6.54, 69.68, 0.64, 5.5, 2.87, 14.26, 44.74, 3.97] [21.69, 8.92, 22.33, 8.22, 13.65, 38.69, 15.82, 3.33, 9.88, 57.47] [32.61, 8.4, 0.14, 5.47, 4.09, 48.72, 30.4, 13.32, 12.6, 44.25] [2.56, 31.74, 38.63, 4.93, 45.22, 10.95, 7.8, 15.75, 13.96, 28.46] [11.31, 10.21, 1.09, 7.8, 30.58, 43.52, 29.68, 55.75, 7.05, 3.01] [19.96, 53.82, 8.67, 18.44, 6.52, 11.43, 38.6, 1.93, 20.37, 20.26]

     可以对比一下不同的思路:

    # 方法二:
    # 发红包
    #     红包数量 钱数
    #     拼手气红包
    import random
    def func(x,y):
        count = 1
        lst = []
        while count <= num:
            for i in range(num):
                global money
                bonus = random.uniform(0.01,money-(0.01*num)) #取随机小时, 范围是0.01 - money
                bonus = round(bonus,2) #取小数点后保留两位
                money = money - bonus
                count = count + 1
                lst.append(bonus)
                random.shuffle(lst) #对生成的结果重新洗牌
                # 但是缺点还是存在, 这种算法的缺点是因为一开始会有人先抽取一个大数,剩余的人在剩下的小范围内抽数
                # 很少再有人抽到的数比第一个人的大. 虽然shuffle 把抽取结果重新洗牌了,但是还会看到数字分布有极端
            return lst
    num = 5 #int(input("红包个数:"))
    money = 20 #int(input("金额:"))
    print(func(num,money))
    for i in range(10):
        num = 5 #int(input("红包个数:"))
        money = 20 #int(input("金额:"))
        print(func(num,money))
    
    结果: 可以发现有一个两个比较大的数,剩余的都很小
    [1.11, 0.14, 6.44, 0.19, 11.55]
    [6.29, 0.04, 10.68, 0.76, 1.21]
    [2.58, 0.02, 14.79, 1.01, 1.24]
    [0.01, 9.85, 0.04, 9.04, 0.96]
    [0.02, 2.13, 0.83, 13.3, 3.64]
    [0.32, 0.25, 5.12, 3.04, 11.19]
    [18.83, 0.36, 0.07, 0.05, 0.62]
    [0.07, 17.4, 2.29, 0.16, 0.02]
    [10.23, 1.37, 0.98, 2.31, 4.4]
    [2.59, 0.12, 1.75, 0.65, 13.51]
  • 相关阅读:
    css笔记
    js面向对象开发之--元素拖拽
    git命令笔记
    数据扁平化笔记。
    手写冒泡排序
    ant design-Table组件实现每一行某个特定字段连续相同进行行合并。
    Array.prototype.reduce()。
    I/O多路复用
    TCP/IP四层体系结构
    TCP的三次握手和四次挥手,为什么?
  • 原文地址:https://www.cnblogs.com/kenD/p/9519422.html
Copyright © 2020-2023  润新知