Java权重随机的实现方法
作者:shichen2014 时间:2021-10-05 14:27:50
本文实例讲述了Java权重随机的实现方法。分享给大家供大家参考。具体分析如下:
权重随机在项目中经常用到,所以我把它抽象到一个工具类中。
一般实现随机权重有两种方式:
1. 使用一个数组存放权重对应的实际目标,比如A的权重是2,B的权重是3,那么数组长度为5, 数组前两个存放A,后三个存放B。
然后随机一个[0-数据长度)的数字,直接取数组对应下标的值就可以了。
优点:数据结构简单,算法高效,实现简单
缺点:当权重值比较大同时数据又比较多的时候,会浪费内存
2. 使用区间算法,从前到后依次叠加权重,然后随机一个[1-权重和]的数字,再用随机的权重依次减去每个元素的权重,当第一个小于等于0的元素就是我们找元素
这里实现可以借用Arrays的binarySearch方法。
完整实例代码点击此处本站下载。
贴一下代码:
WeightMeta.java:
/**
* 建议使用RandomUtil类创建RandomMeta对象
* @author wxf on 14-5-5.
*/
public class WeightMeta<T> {
private final Random ran = new Random();
private final T[] nodes;
private final int[] weights;
private final int maxW;
public WeightMeta(T[] nodes, int[] weights) {
this.nodes = nodes;
this.weights = weights;
this.maxW = weights[weights.length - 1];
}
/**
* 该方法返回权重随机对象
* @return
*/
public T random() {
int index = Arrays.binarySearch(weights, ran.nextInt(maxW) + 1);
if (index < 0) {
index = -1 - index;
}
return nodes[index];
}
public T random(int ranInt) {
if (ranInt > maxW) {
ranInt = maxW;
} else if(ranInt < 0){
ranInt = 1;
} else {
ranInt ++;
}
int index = Arrays.binarySearch(weights, ranInt);
if (index < 0) {
index = -1 - index;
}
return nodes[index];
}
@Override
public String toString() {
StringBuilder l1 = new StringBuilder();
StringBuilder l2 = new StringBuilder("[random]\t");
StringBuilder l3 = new StringBuilder("[node]\t\t");
l1.append(this.getClass().getName()).append(":").append(this.hashCode()).append(":\n").append("[index]\t\t");
for (int i = 0; i < weights.length; i++) {
l1.append(i).append("\t");
l2.append(weights[i]).append("\t");
l3.append(nodes[i]).append("\t");
}
l1.append("\n");
l2.append("\n");
l3.append("\n");
return l1.append(l2).append(l3).toString();
}
}
RandomUtil.java:
/**
* 随机工具类
*
* 使用权重的集合Map构建随机元数据对象
*
* 比如:
* 我们有3个url地址,他们的权重分别为1,2,3现在我们利用RandomUtil来根据权重随机获取url:
*
* <p><blockquote><pre>
*
* map.put(url1, 1);
* map.put(url2, 2);
* map.put(url3, 3);
* RandomMeta<String, Integer> md = RandomUtil.buildWeightMeta(map);
* String weightRandomUrl = md.random();
*
* </pre></blockquote><p>
*
* @author wxf on 14-5-5.
*/
public class RandomUtil {
public static <T> WeightMeta<T> buildWeightMeta(final Map<T, Integer> weightMap) {
final int size = weightMap.size();
Object[] nodes = new Object[size];
int[] weights = new int[size];
int index = 0;
int weightAdder = 0;
for (Map.Entry<T, Integer> each : weightMap.entrySet()) {
nodes[index] = each.getKey();
weights[index++] = (weightAdder = weightAdder + each.getValue());
}
return new WeightMeta<T>((T[]) nodes, weights);
}
}
希望本文所述对大家的Java程序设计有所帮助。
标签:Java,随机
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java接口继承和使用接口操作示例
2023-11-29 05:08:43
Java实现对两个List快速去重并排序操作示例
2023-05-02 03:40:14
![](https://img.aspxhome.com/file/2023/7/71937_0s.png)
Java的Struts框架简介与环境配置教程
2023-10-29 05:23:03
![](https://img.aspxhome.com/file/2023/8/58728_0s.jpg)
C#判断某个软件是否已安装实现代码分享
2022-07-15 16:34:06
javaweb学习总结——使用JDBC处理MySQL大数据
2022-10-19 22:45:32
![](https://img.aspxhome.com/file/2023/6/63756_0s.png)
关于idea中SpringBoot启动失败的坑
2022-07-18 13:02:24
![](https://img.aspxhome.com/file/2023/4/62234_0s.png)
springmvc 防止表单重复提交的两种方法
2023-03-27 17:57:18
基于Java8实现提高Excel读写效率
2023-11-25 10:01:37
JDK 7U15在 Windows x86平台下的安装方法
2023-04-09 07:31:08
![](https://img.aspxhome.com/file/2023/4/72324_0s.png)
Java并发之ReentrantLock类源码解析
2022-08-09 18:10:35
![](https://img.aspxhome.com/file/2023/5/69695_0s.jpg)
C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法
2023-03-26 14:44:41
![](https://img.aspxhome.com/file/2023/4/72484_0s.gif)
C#设置文件权限的方法
2022-08-31 22:35:42
C#实现将网址生成二维码图片方法介绍
2022-08-14 02:31:49
![](https://img.aspxhome.com/file/2023/3/78163_0s.png)
从 JVM 中深入探究 Synchronized作用及原理
2023-07-28 17:22:33
Java线程安全解决方案(synchronized,ReentrantLock,Atomic)
2022-06-13 12:51:09
java自定义切面增强方式(关于自定义注解aop)
2022-05-30 15:16:58
Java及数据库对日期进行格式化方式
2023-08-23 12:27:52
![](https://img.aspxhome.com/file/2023/2/58462_0s.jpg)
Java实现堆排序和图解
2023-11-11 12:13:37
![](https://img.aspxhome.com/file/2023/6/59336_0s.png)
Android编程开发之TextView单击链接弹出Activity的方法
2023-08-06 18:27:11
![](https://img.aspxhome.com/file/2023/4/83544_0s.png)
Java针对ArrayList自定义排序的2种实现方法
2022-01-30 03:47:34