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

按權重選取目標的Java算法

編輯:關於JAVA

最近在做一個武將系統,是一個比較繁瑣的系統,用例比較多。安排了兩周時間給我開發,但是光是開發的話一周就夠了,剩下的時間用來調試。關於這個系統,個人比較感興趣的是其中與權重有關的部分。每個武將有不同的出現機率,且每個武將對應多個權重不同的成長值。這裡有兩處地方與權重有關了,剛開始以為自己寫了個很巧妙的算法,現在回想起那是多麼的低效。因為武將的個數不確定,權重的總和也不確定,所以剛開始感覺有點棘手。解決的辦法是有,但是感覺不夠好。

假設權重總和是total,那麼在這個范圍內產生一個隨機數,觀察這個隨機數的所在區間,就能確定在哪個權重的范圍之內了。

舉個例子,有三個武將A、B、C,他們的出現機率分別是30%、40%和30%。首先產生一個隨機數,這裡的權重總和是100,分為三個區間,1~30,31~70,71~100。自然隨機數的范圍也在100以內。假如這個隨機數是49,很明顯49是在31~70這個區間內,那麼可確定該次隨機產生的武將是B。思路是這樣,但是怎麼用算法去實現呢?

對於確定的情況,一個最簡單的方法是這樣:

  1. int rand = 49;//隨機數,這裡假設是個給定值
  2. int A = 30;
  3. int B = 40;
  4. int C = 30;
  5. if(rand>0 && rand<=A){
  6. return A;
  7. }
  8. else if(rand>A && rand<=A+B){
  9. return B;
  10. }
  11. else if(rand>A+B && rand<=A+B+C){
  12. return C;
  13. }

但是上面說過,這個權重的總和是不確定的,武將個數也不確定,這樣做肯定不行。

後來想到了一個簡單的辦法:

  1. int rand = 49;//隨機數
  2. int sum= 0;
  3. List<武將> list = new ArrayList<武將>();//假設這是一個武將列表
  4. for(int i=0;i<list.size();i++){
  5. sum = list.get(i).getWeight();//武將的出現機率
  6. if(rand<=sum){
  7. return i;//返回該武將對應的索引
  8. }
  9. }

不知道這是不是一個好的辦法?或者有什麼不妥之處?

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