按权重选取目标的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. }  

不知道这是不是一个好的办法?或者有什么不妥之处?

原文链接:http://www.cnblogs.com/wuchen/archive/2012/02/23/2365484.html

【编辑推荐】

  1. 通用Java文件上传和下载组件的设计与实现
  2. 赶紧重写Java的时间和日期API吧!
  3. 谈谈Java的自动装箱和拆箱
  4. 如何进行Java EE性能测试与调优
  5. Java 8新功能详细解读
责任编辑:林师授 来源: 咖啡陪伴宇的博客
相关推荐

2011-04-19 10:45:44

路由算法

2009-02-25 09:05:09

路由算法路由器

2011-05-10 16:36:03

SEO关键词

2015-08-06 13:19:51

2015-09-16 10:47:32

2011-05-24 10:51:18

关键词

2019-06-04 08:34:52

2021-06-14 08:10:06

网络攻击JBS网络安全

2009-12-22 15:28:45

ASP.NET AJA

2011-10-11 09:15:58

移动应用PhoneGapGoodDay

2014-07-21 15:08:53

2024-01-15 08:52:34

自动驾驶目标检测

2022-12-19 15:32:33

2023-11-01 11:18:07

ITCIO

2020-09-10 09:49:02

企业架构数字化敏捷

2021-08-05 05:01:35

负载均衡算法

2017-04-07 13:18:13

2011-03-25 15:59:52

税务申报诈骗迈克菲

2021-12-09 11:09:30

数字化转型

2020-09-30 14:12:07

网络安全
点赞
收藏

51CTO技术栈公众号