<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    權重隨機算法的java實現

    時間:2025-03-11 06:38:28 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{

      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通用組合算法如何實現05-12

    JAVA簡單選擇排序算法及實現02-10

    如何實現java漢諾塔遞歸算法04-20

    java算法實現排列組合的方法介紹03-08

    冒泡排序算法原理及JAVA實現代碼方法03-20

    Java基于余弦方法實現的計算相似度算法示例02-10

    Java排序算法06-17

    PHP實現抽獎概率算法03-21

    java常見的排序算法的代碼03-26

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人