权重随机算法的java实现
一、概述
平时,经常会遇到权重随机算法,从不同权重的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实现相关推荐
- java 权重_权重随机算法的java实现
一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...
- java 权重_java实现权重随机算法
权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...
- java实现权重随机算法
权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...
- 抽奖算法 中奖算法 权重随机算法实现 中奖概率实现方式 无需配置中奖概率 自我实现
封装好的工具类 /*** 随机工具** @author cc* @date 2021/5/18*/ public class RandomUtil {private static final int ...
- java random算法_负载均衡--随机算法(Random)
随机算法是指:从服务器列表中,随机选取一台服务器进行访问.由概率论可以得知,随着客户端调用服务端的次数增多,其实际效果趋近于平均分配请求到服务端的每一台服务器,也就是达到轮询的效果. 一.算法描述 假 ...
- 实现权重抽奖算法(java)
实现权重抽奖算法(java) 1. 算法思想 为了完成随机抽取一个奖品的目的,我们需要在奖品对应的实体中有相应的权重字段,用来区别限制某种奖品对应的被抽中的概率. 首先要遍历全部奖品,将权重进行加合. ...
- java实现加权随机,负载均衡--加权随机算法(Weight Random)
加权随机法根据服务器的配置和系统的负载,分配不同的权重,按照权重随机请求后端服务器. 一.算法描述 假设有 N 台服务器 S = {S0, S1, S2, -, Sn},权重为 W = {W0, W1 ...
- 负载均衡算法-权重随机均衡
权重随机均衡(Weighted Random):此种均衡算法类似于权重轮询算法,不过在处理请求分担时是个随机选择的过程.
- Dubbo中基于权重的随机算法
转载自dubbo源码解析-LoadBalance dubbo的源码地址:https://github.com/alibaba/dubbo Dubbo中的RandomLoadBalance采用基于权重的 ...
最新文章
- CMS垃圾收集器小实验之CMSInitiatingOccupancyFraction参数
- python登录网页账号密码_Python 通过爬虫实现GitHub网页的模拟登录的示例代码
- EleemntUI中el-table的formatter格式化字典显示的使用
- 转盘抽奖(主要:概率和JQ)
- 家里网线的接法和顺序
- Win10系统java环境配置
- 【OpenCV 例程200篇】73. 二维连续傅里叶变换
- 生成树协议实验报告_多生成树协议MSTP
- 1000道Python题库系列分享十二(9道编程题)
- 科大讯飞输入法解锁高效语音输入
- coreseek mysql_centos+php+coreseek+sphinx+mysql之一coreseek安装篇
- 解决undefined reference to `WinMain'
- Qt模仿网易云黑胶片转动动画
- /usr/bin/ld: cannot find -lnl-genl-3
- 训练fater rcnn时出现path not exist问题
- STM32SPI通信原理
- 小程序中纯CSS实现仿京东小优惠券图标
- 机器学习:使用scikit-learn的线性回归预测Google股票
- html5城堡防御游戏《小英雄呼呼》截图
- 1.2线性代数之行列式,余子式及代数余子式
热门文章
- linux网络编程--select/poll/epoll 详解
- 教师计算机考试登记网,计算机等级考试及计算机资格考试
- python表格对齐_Python对Excel表格数据重新排版
- rabbitMQ教程 spring整合rabbitMQ代码实例
- 【图解】java8性能对比_Java 11 究竟比 8 快了多少?
- 1027 打印沙漏 (20分)——27行代码AC(结构清晰)
- 软件测试部分习题答案
- git中的工作区,暂存区,版本库
- mysql删除属性_SQL语句处理一些修改、新增、删除、修改属性操作(MySql)
- Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)