- 相關推薦
權重隨機算法的java實現
本文實例講述了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{
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]tt");
l1.append(this.getClass().getName()).append(":").append(this.hashCode()).append(":n").append("[index]tt");
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:
* map.put(url1, 1);
* map.put(url2, 2);
* map.put(url3, 3);
* RandomMetamd = RandomUtil.buildWeightMeta(map);
* String weightRandomUrl = md.random();
* @author wxf on 14-5-5.
*/
public class RandomUtil {
public staticWeightMetabuildWeightMeta(final MapweightMap) {
final int size = weightMap.size();
Object[] nodes = new Object[size];
int[] weights = new int[size];
int index = 0;
int weightAdder = 0;
for (Map.Entryeach : weightMap.entrySet()) {
nodes[index] = each.getKey();
weights[index++] = (weightAdder = weightAdder + each.getValue());
}
return new WeightMeta((T[]) nodes, weights);
}
}
希望本文所述對大家的Java程序設計有所幫助。
【權重隨機算法的java實現】相關文章:
java通用組合算法如何實現09-12
關于Java動態實現的方法08-23
PID算法的C語言實現07-19
實現java屏幕抓屏的方法08-24
java中全排列是如何生成算法09-05
Java常用的五大排序算法09-09
java構造函數實現代碼示例08-23
C語言實現歸并排序算法實例09-18
C#實現協同過濾算法的實例代碼06-19
關于java實現http請求工具類示例09-09