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]

 

posted on 2018-08-22 18:02  KD_131  阅读(2183)  评论(0编辑  收藏  举报