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

Java完成按權重隨機數

編輯:關於JAVA

Java完成按權重隨機數。本站提示廣大學習愛好者:(Java完成按權重隨機數)文章只能為提供參考,不一定能成為您想要的結果。以下是Java完成按權重隨機數正文


1、成績界說:

問下有一個數組,這些數組中的值都有本身的權重,如何設計能力高效的優先掏出權重高的數??

例如:

權重: 8  2  11  79
權重前往的值: 0  1  2   3

2、剖析成績:

思緒一:創立一個數組數組年夜小為權重和的年夜小,如值0的權重是8,則放入8個0值,值1的權重是2,則放入2個1值,順次類推。
然後用用一個權重和年夜小的隨機數,發生隨機數,便可。缺陷要占用過量的內存。

思緒二:

權重和數組 w[i]存儲的是[0,i]元素的一切元素的權重和  時光龐雜度O(n) 空間龐雜度O(n)
隨機[0,W[399]] 看隨機數 落在哪一個Wi 內就選哪一個  時光龐雜度 O(longn)
所以總的時光龐雜度時光龐雜度O(n) 空間龐雜度O(n)

偽代碼:

輪盤賭 其實不是一種特殊好的選擇算子,但它輕易完成。
起首要明確一點,因為穿插、變異等算子,其實不能掌握退化偏向,所以退化的重擔落在選擇算子上。
假如明確了這一點,就好辦了。

輪盤賭,就是積聚幾率來完成的,平日順應度年夜的被選擇的概率較高。
假設:fit為順應度數組,共m個

for i=1 to m '先乞降
sum=sum+fit(i)
next i
For i = 1 To n ‘n-是要生成若干個個別
temp = temp + fit(i)
If rnd <= temp / sum Then
   輸入 i 就是成果
Exit Function
End If
Next i

3、處理成績:


package datastruct; 
 
import java.util.HashMap; 
import java.util.Map; 
 
/**
權重隨機數:
如              權重:8  2  11  79
        權重前往的值:0  1  2   3
@author ajian005 [email protected]
2014-2-16 21:12
輸入成果:{2.0=184128, 11.0=348551, 79.0=1308100, 8.0=159221}
*/ 
 
public class WeightRandomTest { 
    private static double[] weightArrays = {8.0,2.0,11.0,79.0};  // 數組下標是要前往的值,數組值為數組下標的權重 
    public static void main(String[] args) { 
        WeightRandom weightRandom = new WeightRandom(); 
        Map<Double, Integer> stat = new HashMap<Double, Integer>(); 
        for (int i = 0; i < 2000000; i++) { 
            int weightValue = weightRandom.getWeightRandom(weightArrays); 
            if (weightValue < 0) { 
                continue; 
            } 
            System.out.println("按權重前往的隨機數:" + weightValue); 
            if (stat.get(weightArrays[weightValue]) == null) { 
                stat.put(weightArrays[weightValue], 1); 
            } else { 
                stat.put(weightArrays[weightValue], stat.get(weightArrays[weightValue])+1); 
            } 
        } 
        System.out.println(stat); 
    } 

 
class WeightRandom { 
    java.util.Random r = new java.util.Random(); 
    private double weightArraySum(double [] weightArrays) { 
        double weightSum = 0; 
        for (double weightValue : weightArrays) { 
            weightSum += weightValue; 
        } 
        return weightSum; 
    } 
    public int getWeightRandom(double [] weightArrays) { 
        double weightSum = weightArraySum(weightArrays); 
        double stepWeightSum = 0; 
        for (int i = 0; i < weightArrays.length; i++) { 
            stepWeightSum += weightArrays[i]; 
            if (Math.random() <= stepWeightSum/weightSum) { 
                //System.out.println(i); 
                return i; 
            } 
        } 
        System.out.println("失足誤了"); 
        return -1; 
    }    

4、歸結總結:

俄羅斯輪盤賭就是積聚幾率來完成

按權重負載調劑等

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