昨天去面试一个公司的时候,和对方技术负责人聊到一半,突然叫我现场写 一个微信红包出来,当时我是懵逼的(之前叫我手写一个排序出来,我只写出了一个冒泡出来),但是想了几秒钟,觉得应该挺简单的吧,发红包不就是点击一次抢红包然后分配一次新的红包么,直接写个生成器出来不就搞定了
然后我按照我的简单思路顺序写了个生成器出来,每次新红包从上一次的余额中随机分配,我写到一半就已经发觉这个问题没那么简单了。。每次都随机分配,那么各个红包之间的差别就太大了,而且关键我还把生成器写错了。
后来稍微查了一下资料,原来真正的发红包算法里面每一次抢到红包金额
的数学期望都是相等的,主要核心算法就是每一次红包的金额为当前的(总金额/红包个数)*2,比如总金额100元,分10个红包,那么第一个红包的随机区间为(0,20),它的期望为10,同理第二个红包的理论期望值也为10,算法其实很简单,但是也很巧妙,感觉概率论的东西都忘光了,还好还记得期望是个啥东西
python实现
import random
def hb_generator(hongbao_num, money_sum):
hongbao_remain = hongbao_num
for i in range(hongbao_num -1):
min = 0.01
max = money_sum/hongbao_remain*2
money = round(random.uniform(0, max), 2)
hongbao_money = money if money > min else min
hongbao_remain -= 1
money_sum -= hongbao_money
yield hongbao_money
yield round(money_sum, 2)