权重随机算法的java实现
本文实例讲述了Java权重随机的实现方法。分享给大家供大家参考。具体分析如下:
权重随机在项目中经常用到,所以我把它抽象到一个工具类中。
一般实现随机权重有两种方式:
1. 使用一个数组存放权重对应的实际目标,比如A的权重是2,B的'权重是3,那么数组长度为5, 数组前两个存放A,后三个存放B。
然后随机一个[0-数据长度)的数字,直接取数组对应下标的值就可以了。
优点:数据结构简单,算法高效,实现简单
缺点:当权重值比较大同时数据又比较多的时候,会浪费内存
2. 使用区间算法,从前到后依次叠加权重,然后随机一个[1-权重和]的数字,再用随机的权重依次减去每个元素的权重,当第一个小于等于0的元素就是我们找元素
这里实现可以借用Arrays的binarySearch方法。
完整实例代码点击此处本站下载。
贴一下代码:
:
复制代码 代码如下:/**
* 建议使用RandomUtil类创建RandomMeta对象
* @author wxf on 14-5-5.
*/
public class WeightMeta{
private final Random ran = new Random();
private final T[] nodes;
private final int[] weights;
private final int maxW;
public WeightMeta(T[] nodes, int[] weights) {
s = nodes;
hts = weights;
= weights[th - 1];
}
/**
* 该方法返回权重随机对象
* @return
*/
public T random() {
int index = rySearch(weights, Int(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 = rySearch(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]tt");
nd(lass()ame())nd(":")nd(Code())nd(":n")nd("[index]tt");
for (int i = 0; i < th; i++) {
nd(i)nd("t");
nd(weights[i])nd("t");
nd(nodes[i])nd("t");
nd("n");
nd("n");
nd("n");
return nd(l2)nd(l3)ring();
:
复制代码 代码如下:/**
* 随机工具类
* 使用权重的集合Map构建随机元数据对象
* 比如:
* 我们有3个url地址,他们的权重分别为1,2,3现在我们利用RandomUtil来根据权重随机获取url:
* (url1, 1);
* (url2, 2);
* (url3, 3);
* RandomMetamd = dWeightMeta(map);
* String weightRandomUrl = om();
* @author wxf on 14-5-5.
*/
public class RandomUtil {
public staticWeightMetabuildWeightMeta(final MapweightMap) {
final int size = ();
Object[] nodes = new Object[size];
int[] weights = new int[size];
int index = 0;
int weightAdder = 0;
for (yeach : ySet()) {
nodes[index] = ey();
weights[index++] = (weightAdder = weightAdder + alue());
}
return new WeightMeta((T[]) nodes, weights);
}
}
希望本文所述对大家的Java程序设计有所帮助。
-
Java Class文件是什么
Class类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的Java应用程序中的类和接口。比如:每个数组均属于一个Class类对象,所有具有相同元素类型和维数的数组共享...
-
Java测试题及答案
Java测试题及答案学习是把知识能力思维方法等转化为你的私有产权的重要手段,是公有转私的重要途径。以下是本站小编整理的Java测试题及答案,欢迎学习!试题1指出下面语句没有编译错误的是()。A.longn=999999999999;n=999999999999L;C.longn=999999999999L;D.doubl...
-
计算机二级JAVA考试强化训练题(单选)
为帮助考生们更快第掌握二级JAVA相应知识点,以下是本站小编搜索整理的一份计算机二级JAVA考试强化训练题(单选),供参考练习,预祝考生们考出自己理想的成绩!想了解更多相关信息请持续关注我们应届毕业生考试网!单选题1).下列关于Applet的安全限制的叙述中,错误的是(...
-
新手学习Java最高效的10个计划
对于新手来说学习Java如同堵天书,下面是本站小编收集的关于新手学习Java最高效的10个计划,希望可以为您的学习带来帮助!计划一:了解未来技术发展方向两耳不闻窗外事,在如今是不合适的,尤其是在瞬息万变的互联网时代,作为一个开发者技术跟不上可以去专研,思想要跟不上,...