按權重選取目標的java演算法

2021-06-04 13:46:51 字數 1037 閱讀 7009

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

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

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

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

1

int rand = 49;//

隨機數,這裡假設是個給定值

2int a = 30;

3int b = 40;

4int c = 30;

5if(rand>0 && rand<=a)

8else

if(rand>a && rand<=a+b)

11else

if(rand>a+b && rand<=a+b+c)

複製**

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

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

int rand = 49;//

隨機數int sum= 0;

list《武將》 list = new arraylist《武將》();//

假設這是乙個武將列表

for(int i=0;i//

武將的出現機率

if(rand<=sum)

}

複製**

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

opencv選取目標

好久沒發了,當初自己在 上做的筆記,現在想再用的時候,知識點沒記住,也找不到了。還是自己整理下比較靠譜,雖然都是最簡單的內容。opencv在上畫圓圈 cvcircle cvarr img,cvpoint center,int radius,cvscalar color,int thickness 1...

按權重隨機

以下 為c 語言,變為其他語言也很容易。說明 1.該演算法複雜度為線性,且無需對權重排序。是我想到的最高效的了。private static list weightkey new list private static list weightvaluefloat new list private s...

opengl多目標選取

選取的目標有兩類,一類是選取單一物件,另一類是選取多個物件。因此選取方法分為點選和框選。使用何種具體方法來選取已經有很多文章,比如使用gl picking 函式,顏色,或者構造射線來進行點選 關於框選的文章相對較少。另外如果繪製的物件是海量的點或三角形等物件,如何進行大量物件的選取並就會變得更具挑戰...