程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java權重隨機的完成辦法

Java權重隨機的完成辦法

編輯:關於JAVA

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved