当存在一批通道,根据权重,选择哪个通道去使用的简单算法。
利用随机数,数据区间,来获取通道。
通道权重越大,单位时间内使用该通道的概率会大一些。
代码
1 //利用了一个权重区间的比例问题,抓取随机数的可能性,来体现权重思想 2 public static void main(String[] args) { 3 //定义三个通道的权重,按随机数选拔使用哪个通道。 4 //A 10 B 70 C 30 5 //从数据库查询出list集合 6 ChannelD A=new ChannelD("A",10); 7 ChannelD B=new ChannelD("B",70); 8 ChannelD C=new ChannelD("C",30); 9 List<ChannelD> channels=new ArrayList<OrderChannelServiceImpl.ChannelD>(); 10 channels.add(A); 11 channels.add(B); 12 channels.add(C); 13 14 Map<Integer,String> map=new HashMap<Integer, String>(); 15 Integer sum=0;//记录权重之和 16 for (ChannelD channel : channels) { 17 sum+=channel.getWeight(); 18 map.put(sum,channel.getName()); 19 } 20 21 Set<Integer> set=map.keySet(); 22 23 for (Integer integer : set) { 24 Random r = new Random(System.currentTimeMillis());//随机数 25 //radom的取值区间为[0,110) 26 // 10--A 80--B 110--C 27 //A[0,10]占10个值的可能 B[10,80]占70个值的可能 C[80,110]占30个值的可能 28 //set集合是无顺序的,遍历也是无顺序的。 29 //余数是随机的。体现了权重思想。 30 int radom = Math.abs(r.nextInt())%sum;//取余 31 if(integer>radom){ 32 String channelDName=map.get(integer); 33 System.out.println("被选拔出来的通道为:"+channelDName); 34 } 35 } 36 } 37 38 class ChannelD{ 39 private String name;//通道名字 40 private Integer weight;//权重 41 42 public ChannelD(String name,Integer weight){ 43 this.name=name; 44 this.weight=weight; 45 } 46 47 public String getName() { 48 return name; 49 } 50 51 public void setName(String name) { 52 this.name = name; 53 } 54 55 public Integer getWeight() { 56 return weight; 57 } 58 59 public void setWeight(Integer weight) { 60 this.weight = weight; 61 } 62 63 64 65 }