快捷搜索:  test

说明生成的红包超过预算了

  CleverCode最近接到一个需求,需要写一个固定红包 + 随机红包算法。

  如果我们使用随机函数rand。rand(0.01,0.99);那么10次随机,如果最坏情况都是金额0.99,总金额就是9.9元。会超过5元。金额也会不正态分布。最后思考了一下借助与数学函数来当作随机红包的发生器,可以用抛物线,三角函数。最后选定了等腰三角线 算法原理

  如果需要发红包总金额是totalMoney,红包个数是num个,金额范围是[min,max],线性方程如图。

  如果需要发红包总金额是11470,红包个数是7400个,金额范围是[0.01,3.09],线 源码设计

  //如果$leftMoney 0 ,说明生成的红包超过预算了,需要减少部分红包金额

  这里使用了php的随机排序函数,shuffle($okData),所以看到的结果不是线性的,这个结果更加随机性。

  简单来说,就是把一个大整数m分解(直接以“分为单位,如1元即100)分解成n个小整数的过程,小整数的范围是[min, max]。

  理想的红包生成结果是平均值附近的红包比较多,大红包和小红包的数量比较少。

  * 生产min和max之间的随机数,但是概率不是平均的,从min到max方向概率逐渐加大。

  //这样的随机数的概率实际改变了,产生大数的可能性要比产生小数的概率要小。

  //因为小红包的数量通常是要比大红包的数量要多的,因为这里的概率要调换过来。

  最近看了一篇文章,讲微信红包随机算法的。感觉很不错,所以自己实现了下,并进行了简单测试。

  有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢)

  答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

  实时性:为什么明明抢到红包,点开后发现没有?答:2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。

  注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。

  答:微信从财付通拉取金额数据郭莱,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的裸祭(逻辑)处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回归。

  答:cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照20万笔每秒入账准备,但实际还不到8万每秒。

声明:本文图片、文章来源于网络,不代表红包之意见及观点,如有侵权,请与我联系删除。转载请注明出处: http://www.shxiteng.com/weixinhongbao/10357.html

您可能还会对下面的文章感兴趣: