相关产品
RocketMQ
之前在阿里的 负载均衡 比赛中,就有这个算法,RocketMQ 中包含多种负载算法,其中 权重 算法就属于其中一种,也是最实用的一种。
奖励系统
经常会有许多活动、或则任务、当用户完成后,可以获得相关的奖励,当然可以是提前定死的几个、但如果想要 产出不同的 奖励的话,给每个物件配置相关的权重,就可以实现。
设计思路
例如存在这些数据
itemId weight
1 10
2 20
3 10
sum = 10 + 20 + 10
list = {10, 30, 40}
rand = 随机数(0,1)
weight = rand * sum
当
weight 属于 (0,10] => index = 0
weight 属于 (10,30] => index = 1
weight 属于 (30,40] => index = 2
Code
cs
public static int RandomByWeight(int[] weights)
{
int sum = 0;
for (int i = 0; i < weights.Length; i++)
{
sum += weights[i];
}
// 权重全为0 则返回 -1
if (sum == 0)
{
return -1;
}
int rand = Rand(sum);
int sum = 0;
for (int i = 0; i < weights.Length; i++)
{
sum += weights[i];
if (rand <= sum)
{
return i;
}
}
return -1;
}