经典思路题(1)发红包

微信发红包思路

需求:每个人获得红包数量的大小和概论都是随机并且公平的,红包金额money,数量num。

思路整理

第一种:随机取num个随机数,从random库,且取值范围相同,然后计算每一个份所占的比率,在求每一份的金额大小。

def red_packet(money,num):
    """
    发红包
    :param money: 
    :param num: 
    :return: 
    """
    # 获得十个随机数,并加入列表
    lis = []
    for i in range(num):
        n = random.randint(1,2000)
        lis.append(n)
    
    # 根据随机数站的比率取红包的大小
    for j in range(len(lis)):
        res = 200*lis[j]/sum(lis)
        yield round(res,2)


ret = red_packet(200,10)
for i in ret:
    print(i)
比率方法分红包

因为比例划分有小数,小数存在四舍五入处理,导致最后红包总额和总金额有误差, 不能完美解决。

 

第二种:在一个0-200的区间随机取点数,根据点数之间的区间,划分每个红包的大小,区间是连续不间断的,所以总和不会出现误差。目前来说比较完美的解决方案

 

# 最完美的解决方案。
def red_packet(money,num):
    ret =  random.sample(range(1,money*100),num-1)
    ret.sort()
    ret.insert(0,0)
    ret.append(money*100)
    for i in range(len(ret)-1):
        value = ret[i+1] - ret[i]
        yield value/100


g = red_packet(200,10)
for i in g:
    print(i)
区间分红包代码

这种方法,利用了区间连续性,放大金额取值考虑小数部分,很完美的解决了红包随机性和总和问题

posted @ 2019-03-26 20:27  ryxiong728  阅读(173)  评论(0)    收藏  举报