权重随机(Weight random)算法的实现思路

权重随机(Weight random)算法的实现思路

2021-9-24·devcxl
devcxl

本文提供了权重随机(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(各产品数量*各自权重)

每次抽奖时重新运算即可

参考资料