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、歸結總結:
俄羅斯輪盤賭就是積聚幾率來完成
按權重負載調劑等