以下是本人的一些分享,我热爱编程,希望能多交编程的爱好者,如果你也是其中一名,那么请加好友,大家关注一下,下面的文章是自己觉得一些有用的东西,留下来给自己当笔记,当然也希望能帮助到你,首先感谢你的阅读~!
最近在做一个武将系统,是一个比较繁琐的系统,用例比较多。安排了两周时间给我开发,但是光是开发的话一周就够了,剩下的时间用来调试。关于这个系统,个人比较感兴趣的是其中与权重有关的部分。每个武将有不同的出现机率,且每个武将对应多个权重不同的成长值。这里有两处地方与权重有关了,刚开始以为自己写了个很巧妙的算法,现在回想起那是多么的低效。因为武将的个数不确定,权重的总和也不确定,所以刚开始感觉有点棘手。解决的办法是有,但是感觉不够好。
假设权重总和是total,那么在这个范围内产生一个随机数,观察这个随机数的所在区间,就能确定在哪个权重的范围之内了。
举个例子,有三个武将A、B、C,他们的出现机率分别是30%、40%和30%。首先产生一个随机数,这里的权重总和是100,分为三个区间,1~30,31~70,71~100。自然随机数的范围也在100以内。假如这个随机数是49,很明显49是在31~70这个区间内,那么可确定该次随机产生的武将是B。思路是这样,但是怎么用算法去实现呢?
对于确定的情况,一个最简单的方法是这样:
int rand = 49;//随机数,这里假设是个给定值 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; }
但是上面说过,这个权重的总和是不确定的,武将个数也不确定,这样做肯定不行。
后来想到了一个简单的办法:
int rand = 49;//随机数 int sum= 0; List<武将> list = new ArrayList<武将>();//假设这是一个武将列表 for(int i=0;i
不知道这是不是一个好的办法?或者有什么不妥之处?
我们在通过不间断地学习,才能获取真正的知识,从来不满足现在所拥有的知识,不断进取是根本,在编程的世界里也是这样,我喜欢获得新的知识,为获得新的知识兴奋,希望你也是一样,学无止境!!!
更多知识请参阅广州达内,或咨询广州达内老师
最近在做一个武将系统,是一个比较繁琐的系统,用例比较多。安排了两周时间给我开发,但是光是开发的话一周就够了,剩下的时间用来调试。关于这个系统,个人比较感兴趣的是其中与权重有关的部分。每个武将有不同的出现机率,且每个武将对应多个权重不同的成长值。这里有两处地方与权重有关了,刚开始以为自己写了个很巧妙的算法,现在回想起那是多么的低效。因为武将的个数不确定,权重的总和也不确定,所以刚开始感觉有点棘手。解决的办法是有,但是感觉不够好。
假设权重总和是total,那么在这个范围内产生一个随机数,观察这个随机数的所在区间,就能确定在哪个权重的范围之内了。
举个例子,有三个武将A、B、C,他们的出现机率分别是30%、40%和30%。首先产生一个随机数,这里的权重总和是100,分为三个区间,1~30,31~70,71~100。自然随机数的范围也在100以内。假如这个随机数是49,很明显49是在31~70这个区间内,那么可确定该次随机产生的武将是B。思路是这样,但是怎么用算法去实现呢?
对于确定的情况,一个最简单的方法是这样:
int rand = 49;//随机数,这里假设是个给定值 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; }
但是上面说过,这个权重的总和是不确定的,武将个数也不确定,这样做肯定不行。
后来想到了一个简单的办法:
int rand = 49;//随机数 int sum= 0; List<武将> list = new ArrayList<武将>();//假设这是一个武将列表 for(int i=0;i
不知道这是不是一个好的办法?或者有什么不妥之处?
我们在通过不间断地学习,才能获取真正的知识,从来不满足现在所拥有的知识,不断进取是根本,在编程的世界里也是这样,我喜欢获得新的知识,为获得新的知识兴奋,希望你也是一样,学无止境!!!
更多知识请参阅广州达内,或咨询广州达内老师