经典思路题(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)
这种方法,利用了区间连续性,放大金额取值考虑小数部分,很完美的解决了红包随机性和总和问题
衣带渐宽终不悔,为伊消得人憔悴!

浙公网安备 33010602011771号