权重设计介绍

2023-10-27

相关产品

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

    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;
    }

权重数据量大

对于数据量超大的业务,可以考虑将数据放在一个中间件中辅助处理

参考

ZRANGEBYSCORE | Redis

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

权重设计介绍 的相关文章

  • C++ fill()和fill_n()函数用法

    fill 和fill n函数是C Primer第十二章泛型算法部分内容 并把它们称为生成和变异算法 也就是说这两个函数只能对输入范围内已存在的元素进行操作 如果试图对空容器进行fill n操作 会导致严重的运行错误 所以在对元素进行写入操作

随机推荐