且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

根据权重挑选通道的简单算法

更新时间:2022-01-29 02:31:34

当存在一批通道,根据权重,选择哪个通道去使用的简单算法。

利用随机数,数据区间,来获取通道。

通道权重越大,单位时间内使用该通道的概率会大一些。

代码

根据权重挑选通道的简单算法根据权重挑选通道的简单算法
 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 }
View Code