按權(quán)重選取目標(biāo)的Java算法
最近在做一個(gè)武將系統(tǒng),是一個(gè)比較繁瑣的系統(tǒng),用例比較多。安排了兩周時(shí)間給我開發(fā),但是光是開發(fā)的話一周就夠了,剩下的時(shí)間用來調(diào)試。關(guān)于這個(gè)系統(tǒng),個(gè)人比較感興趣的是其中與權(quán)重有關(guān)的部分。每個(gè)武將有不同的出現(xiàn)機(jī)率,且每個(gè)武將對(duì)應(yīng)多個(gè)權(quán)重不同的成長(zhǎng)值。這里有兩處地方與權(quán)重有關(guān)了,剛開始以為自己寫了個(gè)很巧妙的算法,現(xiàn)在回想起那是多么的低效。因?yàn)槲鋵⒌膫€(gè)數(shù)不確定,權(quán)重的總和也不確定,所以剛開始感覺有點(diǎn)棘手。解決的辦法是有,但是感覺不夠好。
假設(shè)權(quán)重總和是total,那么在這個(gè)范圍內(nèi)產(chǎn)生一個(gè)隨機(jī)數(shù),觀察這個(gè)隨機(jī)數(shù)的所在區(qū)間,就能確定在哪個(gè)權(quán)重的范圍之內(nèi)了。
舉個(gè)例子,有三個(gè)武將A、B、C,他們的出現(xiàn)機(jī)率分別是30%、40%和30%。首先產(chǎn)生一個(gè)隨機(jī)數(shù),這里的權(quán)重總和是100,分為三個(gè)區(qū)間,1~30,31~70,71~100。自然隨機(jī)數(shù)的范圍也在100以內(nèi)。假如這個(gè)隨機(jī)數(shù)是49,很明顯49是在31~70這個(gè)區(qū)間內(nèi),那么可確定該次隨機(jī)產(chǎn)生的武將是B。思路是這樣,但是怎么用算法去實(shí)現(xiàn)呢?
對(duì)于確定的情況,一個(gè)最簡(jiǎn)單的方法是這樣:
- int rand = 49;//隨機(jī)數(shù),這里假設(shè)是個(gè)給定值
- int A = 30;
- int B = 40;
- int C = 30;
- if(rand>0 && rand<=A){
- return A;
- }
- else if(rand>A && rand<=A+B){
- return B;
- }
- else if(rand>A+B && rand<=A+B+C){
- return C;
- }
但是上面說過,這個(gè)權(quán)重的總和是不確定的,武將個(gè)數(shù)也不確定,這樣做肯定不行。
后來想到了一個(gè)簡(jiǎn)單的辦法:
- int rand = 49;//隨機(jī)數(shù)
- int sum= 0;
- List<武將> list = new ArrayList<武將>();//假設(shè)這是一個(gè)武將列表
- for(int i=0;i<list.size();i++){
- sum = list.get(i).getWeight();//武將的出現(xiàn)機(jī)率
- if(rand<=sum){
- return i;//返回該武將對(duì)應(yīng)的索引
- }
- }
不知道這是不是一個(gè)好的辦法?或者有什么不妥之處?
原文鏈接:http://www.cnblogs.com/wuchen/archive/2012/02/23/2365484.html
【編輯推薦】