一、概述

  平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的。如广告投放、负载均衡等。

  如有4个元素A、B、C、D,权重分别为1、2、3、4,随机结果中A:B:C:D的比例要为1:2:3:4。

  总体思路:累加每个元素的权重A(1)-B(3)-C(6)-D(10),则4个元素的的权重管辖区间分别为[0,1)、[1,3)、[3,6)、[6,10)。然后随机出一个[0,10)之间的随机数。落在哪个区间,则该区间之后的元素即为按权重命中的元素。

  实现方法

利用TreeMap,则构造出的一个树为:
    B(3)
    /      \
        /         \
     A(1)     D(10)
               /
             /
         C(6)

然后,利用treemap.tailMap().firstKey()即可找到目标元素。

当然,也可以利用数组+二分查找来实现。

二、源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.xxx.utils;
import com.google.common.base.Preconditions;
import org.apache.commons.math3.util.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
public class WeightRandom<K,V extends Number> {
    private TreeMap<Double, K> weightMap = new TreeMap<Double, K>();
    private static final Logger logger = LoggerFactory.getLogger(WeightRandom.class);
    public WeightRandom(List<Pair<K, V>> list) {
        Preconditions.checkNotNull(list, "list can NOT be null!");
        for (Pair<K, V> pair : list) {
            double lastWeight = this.weightMap.size() == 0 ? 0 : this.weightMap.lastKey().doubleValue();//统一转为double
            this.weightMap.put(pair.getValue().doubleValue() + lastWeight, pair.getKey());//权重累加
        }
    }
    public K random() {
        double randomWeight = this.weightMap.lastKey() * Math.random();
        SortedMap<Double, K> tailMap = this.weightMap.tailMap(randomWeight, false);
        return this.weightMap.get(tailMap.firstKey());
    }
}

  

  

三、性能

4个元素A、B、C、D,其权重分别为1、2、3、4,运行1亿次,结果如下:

元素 命中次数 误差率
A 10004296 0.0430%
B 19991132 0.0443%
C 30000882 0.0029%
D 40003690 0.0092%

从结果,可以看出,准确率在99.95%以上。

四、另一种实现

利用B+树的原理。叶子结点存放元素,非叶子结点用于索引。非叶子结点有两个属性,分别保存左右子树的累加权重。如下图:

看到这个图,聪明的你应该知道怎么随机了吧。

此方法的优点是:更改一个元素,只须修改该元素到根结点那半部分的权值即可。

更多面试题请狠狠的点击 下载

权重随机算法的java实现相关推荐

  1. java 权重_权重随机算法的java实现

    一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...

  2. java 权重_java实现权重随机算法

    权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...

  3. java实现权重随机算法

    权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...

  4. 抽奖算法 中奖算法 权重随机算法实现 中奖概率实现方式 无需配置中奖概率 自我实现

    封装好的工具类 /*** 随机工具** @author cc* @date 2021/5/18*/ public class RandomUtil {private static final int ...

  5. java random算法_负载均衡--随机算法(Random)

    随机算法是指:从服务器列表中,随机选取一台服务器进行访问.由概率论可以得知,随着客户端调用服务端的次数增多,其实际效果趋近于平均分配请求到服务端的每一台服务器,也就是达到轮询的效果. 一.算法描述 假 ...

  6. 实现权重抽奖算法(java)

    实现权重抽奖算法(java) 1. 算法思想 为了完成随机抽取一个奖品的目的,我们需要在奖品对应的实体中有相应的权重字段,用来区别限制某种奖品对应的被抽中的概率. 首先要遍历全部奖品,将权重进行加合. ...

  7. java实现加权随机,负载均衡--加权随机算法(Weight Random)

    加权随机法根据服务器的配置和系统的负载,分配不同的权重,按照权重随机请求后端服务器. 一.算法描述 假设有 N 台服务器 S = {S0, S1, S2, -, Sn},权重为 W = {W0, W1 ...

  8. 负载均衡算法-权重随机均衡

    权重随机均衡(Weighted Random):此种均衡算法类似于权重轮询算法,不过在处理请求分担时是个随机选择的过程.

  9. Dubbo中基于权重的随机算法

    转载自dubbo源码解析-LoadBalance dubbo的源码地址:https://github.com/alibaba/dubbo Dubbo中的RandomLoadBalance采用基于权重的 ...

最新文章

  1. CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数
  2. python登录网页账号密码_Python 通过爬虫实现GitHub网页的模拟登录的示例代码
  3. EleemntUI中el-table的formatter格式化字典显示的使用
  4. 转盘抽奖(主要:概率和JQ)
  5. 家里网线的接法和顺序
  6. Win10系统java环境配置
  7. 【OpenCV 例程200篇】73. 二维连续傅里叶变换
  8. 生成树协议实验报告_多生成树协议MSTP
  9. 1000道Python题库系列分享十二(9道编程题)
  10. 科大讯飞输入法解锁高效语音输入
  11. coreseek mysql_centos+php+coreseek+sphinx+mysql之一coreseek安装篇
  12. 解决undefined reference to `WinMain'
  13. Qt模仿网易云黑胶片转动动画
  14. /usr/bin/ld: cannot find -lnl-genl-3
  15. 训练fater rcnn时出现path not exist问题
  16. STM32SPI通信原理
  17. 小程序中纯CSS实现仿京东小优惠券图标
  18. 机器学习:使用scikit-learn的线性回归预测Google股票
  19. html5城堡防御游戏《小英雄呼呼》截图
  20. 1.2线性代数之行列式,余子式及代数余子式

热门文章

  1. linux网络编程--select/poll/epoll 详解
  2. 教师计算机考试登记网,计算机等级考试及计算机资格考试
  3. python表格对齐_Python对Excel表格数据重新排版
  4. rabbitMQ教程 spring整合rabbitMQ代码实例
  5. 【图解】java8性能对比_Java 11 究竟比 8 快了多少?
  6. 1027 打印沙漏 (20分)——27行代码AC(结构清晰)
  7. 软件测试部分习题答案
  8. git中的工作区,暂存区,版本库
  9. mysql删除属性_SQL语句处理一些修改、新增、删除、修改属性操作(MySql)
  10. Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)