理论
 交叉轮询权重算法
第一交取权重最大的值,然后将权重减去总权重值
第二交各自加上原始权重,取权重最大的值,然后将权重减去总权重值
算法推演
| Iphone12s | 手机壳 | 鼠标垫 | 鼠标 | |
| 中奖概率(初始总权重26) | 2 | 8 | 10 | 6 | 
| 第一次 | 2 | 8 | 10 —>中奖 ,权重改为 10-26 = -16 | 6 | 
| 第二次(各自加上初始权重) | 4 | 16 —> 中奖,权重改为 16-26 = -10 | -6 | 12 | 
| 第三次(各自加上初始权重) | 6 | -2 | 4 | 18  —> 中奖,权重改为 18-26 = -8 | 
| 第四次(各自加上初始权重) | 8 | 6 | 14—>中奖 ,权重改为 14-26 = -12 | -2 | 
| 第五次(各自加上初始权重) | 10 | 14—>中奖 ,权重改为 14-26 = -12 | -2 | 4 | 
| 第六次(各自加上初始权重) | 12—>中奖 ,权重改为 12-26 = -14 | -4 | 8 | 10 | 
| 第七次(各自加上初始权重) | -12 | 4 | 18—>中奖 ,权重改为 18-26 = -8 | 16 | 
| 第八次(各自加上初始权重) | -10 | 12 | -2 | 22—>中奖 ,权重改为 22-26 = -4 | 
| 第九次(各自加上初始权重) | -8 | 20—>中奖 ,权重改为 20-26 = -6 | 8 | 2 | 
| 第十次(各自加上初始权重) | -6 | 2 | 18—>中奖 ,权重改为 18-26 = -8 | 8 | 
代码实现
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LoadBalancingAlgorithm {     public class LoadBalancing     {         private List<ToDealObj> _toDealObjs { get; set; }         private int  _sumWeight;         public LoadBalancing(List<ToDealObj> objs)         {             _toDealObjs = objs;             _sumWeight = _toDealObjs.Sum(t => t.SrcWeight);         }         public string GetToDealObj()         {             // 交叉轮询权重算法             // 第一次取权重最大的值,然后将权重减去原始总权重             // 第二次各自加上原始权重,取权重最大的值,然后将权重减去原始总权重             ToDealObj obj = _toDealObjs.OrderByDescending(t => t.Weight).First();             obj.Weight -= _sumWeight;             _toDealObjs.ForEach(p => p.Weight += p.SrcWeight);             return obj.Obj;         }     }     public class ToDealObj     {         public string Obj { get; set; }         public int SrcWeight { get; set; }         public int Weight { get; set; }     } } | 
测试代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using System; using System.Collections.Generic; namespace LoadBalancingAlgorithm {     class Program     {         static void Main(string[] args)         {             //Console.WriteLine("Hello World!");             List<ToDealObj> objs = new List<ToDealObj>();             ToDealObj obj = new ToDealObj() { Obj = "Iphone12s", SrcWeight =  2,Weight = 2, };             objs.Add(obj) ;             ToDealObj obj2 = new ToDealObj() { Obj = "手机壳", SrcWeight = 8, Weight  = 8, };             objs.Add(obj2);             ToDealObj obj3 = new ToDealObj() { Obj = "鼠标垫", SrcWeight = 10,  Weight = 10, };             objs.Add(obj3);             ToDealObj obj4 = new ToDealObj() { Obj = "鼠标", SrcWeight = 6, Weight =  6, };             objs.Add(obj4);             LoadBalancing load = new LoadBalancing(objs);             for (int i = 0; i < 10; i++)             {                 Console.WriteLine($"第{i + 1}次中奖的是:{load.GetToDealObj()}");                 }         }     } } | 

 
	


