Java權重隨機的完成辦法。本站提示廣大學習愛好者:(Java權重隨機的完成辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是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<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法式設計有所贊助。