权重随机(Weight random)算法的实现思路
权重随机(Weight random)算法的实现思路
本文提供了权重随机(Weight random)算法的实现思路
权重随机的算法的应用场景常见的有:
- 多台不同配置的服务器按权重来负载均衡
- 游戏中抽取道具根据权重设置中奖率
实现思路
例如,我们现在需要做一个抽奖活动,有三种不同价值的产品:
- 产品A 属于一等奖 权重为0.1
- 产品B 属于二等奖 权重为0.5
- 产品C 属于三等奖 权重为1
- 谢谢惠顾 权重为10
此时我们权重的总和为11.6
取最小权重为1,此时权重总和为116
定义一个长度为116的有序int数组 [0,…,115]
产品A 在数组区间即为:[0]
产品B 在数组区间即为:[1,5)
产品C 在数组区间即为:[5,15)
谢谢惠顾 在数组区间即为:[15,115]
抽奖时取一个区间在[0,115]之间的随机数a
看随机数a位于数组的哪个区间内,位于哪个区间就取哪个奖励
当然只是最简单的一个例子,并未加上奖品库存,我们下面加上产品库存优化一下这个例子
- 产品A 数量3个 属于一等奖 权重为0.1
- 产品B 数量10个 属于二等奖 权重为0.5
- 产品C 数量20个 属于三等奖 权重为1
- 谢谢惠顾 数量不限制 权重调整为100
此时则是 每次抽奖时将数量乘以权重 相加
产品A: 3*0.1=0.3
产品B: 10*0.5=5
产品C: 20*1=20
总权重即为128 中奖率为 28/128
剩下步骤同第一个例子,定义数组,取随机数抽取
但是这样产品的中奖率会随着产品数量的减少而降低
此时谢谢惠顾的权重就要随着产品的数量而减少维持中奖率在 28/128
根据 中奖率 28/128 = (sum(各产品数量各自权重))/(谢谢惠顾权重+sum(各产品数量各自权重))
得 谢谢惠顾权重 = 100/28 * sum(各产品数量*各自权重)
每次抽奖时重新运算即可