按权重选取目标的Java算法

上一篇 / 下一篇  2012-04-13 09:50:17 / 个人分类:Java

最近在做一个武将系统,是一个比较繁琐的系统,用例比较多。安排了两周时间给我开发,但是光是开发的话一周就够了,剩下的时间用来调试。关于这个系统,个人比较感兴趣的是其中与权重有关的部分。每个武将有不同的出现机率,且每个武将对应多个权重不同的成长值。这里有两处地方与权重有关了,刚开始以为自己写了个很巧妙的算法,现在回想起那是多么的低效。因为武将的个数不确定,权重的总和也不确定,所以刚开始感觉有点棘手。解决的办法是有,但是感觉不够好。

:[w m~T fI0  假设权重总和是total,那么在这个范围内产生一个随机数,观察这个随机数的所在区间,就能确定在哪个权重的范围之内了。

^1s VG:l7M,jj Egz)v0

4~xK6f c$u0  举个例子,有三个武将A、B、C,他们的出现机率分别是30%、40%和30%。首先产生一个随机数,这里的权重总和是100,分为三个区间,1~30,31~70,71~100。自然随机数的范围也在100以内。假如这个随机数是49,很明显49是在31~70这个区间内,那么可确定该次随机产生的武将是B。思路是这样,但是怎么用算法去实现呢?51Testing软件测试网P!sT?}eok

51Testing软件测试网7h!J HZpl EBf

  对于确定的情况,一个最简单的方法是这样:

N)b NHSW9@0

kBWh|7A(I&y s051Testing软件测试网-o9J g.y2o#o&w

 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 }
51Testing软件测试网{]R,fp&f

51Testing软件测试网0p kwp F*D,p

-e.|n w)Isx\$}n0  但是上面说过,这个权重的总和是不确定的,武将个数也不确定,这样做肯定不行。

h O2fk;Nz}w0 51Testing软件测试网bh,o;F cT!e

  后来想到了一个简单的办法:51Testing软件测试网$|5f;z+v6pc

:bm6{)xW {i _0

jI1CD-\9w O'QK0
int rand = 49;//随机数51Testing软件测试网y/aj-aoc
U
int sum= 0;51Testing软件测试网s#U/_zW
List<武将> list = new ArrayList<武将>();//假设这是一个武将列表51Testing软件测试网8q5?1O4IH1dD.}&}
for(int i=0;i<list.size();i++){
~&|8dxM/q$a%R:a0sum = list.get(i).getWeight();//武将的出现机率51Testing软件测试网*v#c:`Jp+U&J*e%|^
if(rand<=sum){
E0JRW-R5Hf]0return i;//返回该武将对应的索引51Testing软件测试网 E:N(QcSz
}
*`4s@*s h*en0}

${f0F} nT1|1W0

8L,`Q `9mR0

Ot(q;t5U[w8f0  不知道这是不是一个好的办法?或者有什么不妥之处?

LZlyD!v7wC0

TAG:

 

评分:0

我来说两句

Open Toolbar