红包算法

Posted 晴心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红包算法相关的知识,希望对你有一定的参考价值。

  1  /* n个随机数,总和为sum,每个随机数的范围为[min,max]。
  2     前n-1个用rand函数随机产生,第n个数设为val=sum-(前n-1数之和)。
  3 (1)若val属于[min,max],则可以直接用;
  4 (2)若val>=max,则用max。val-max的处理:在1~n-1中随机出一个序号m来,将多出来的val-max补到这第m个数上,如果将其补为200仍然还有剩余,则继续做这样的操作,直到多余部分被分配完为止。
  5 (3)若val<=min,则用min。min-val的处理:在1~n-1中随机出一个序号m来,将多出来的min-val部分从这第m个数上扣除,如果将其削为min仍然没有扣完,则继续这个操作,直到配平为止。*/
  6 
  7     public class RandomGenerator
  8     {
  9         /// <summary>
 10         /// 生成指定个数的限定金额范围的随机红包,且总额为指定值
 11         /// </summary>
 12         /// <param name="totalValue">指定总额</param>
 13         /// <param name="min">最小边界</param>
 14         /// <param name="max">最大边界</param>
 15         /// <param name="num">数量</param>
 16         /// <returns>以列表的形式返回生成的数据</returns>
 17         public List<double> RandomData(double totalValue, double min, double max, int num, out string message)
 18         {
 19             if (min > max)
 20             {
 21                 message = "min > max,参数错误";
 22             }
 23           
 24             List<double> list = new List<double>();
 25 
 26             //判断参数合理性
 27             if (min * num == totalValue)
 28             {
 29                 for (int i = 0; i < num ; i++)
 30                 {
 31                     list.Add(min);
 32                 }
 33                 message = "fixedValue";
 34                 return list;
 35             }
 36             if (min * num > totalValue)
 37             {
 38                 message = "min * num > totalValue,参数不合理";
 39                 return null;
 40             }
 41             if (max * num == totalValue)
 42             {
 43                 for (int i = 0; i < num; i++)
 44                 {
 45                     list.Add(max);
 46                 }
 47                 message = "fixedValue";
 48                 return list;
 49             }
 50             if (max * num < totalValue)
 51             {
 52                 message = "max * num < totalValue,参数不合理";
 53                 return null; 
 54             }
 55             
 56             double sum = 0.0;
 57             Random random = new Random();
 58             double diffValue = max - min;
 59            
 60             double temp;
 61             //前num-1个数据随机生成
 62             for (int i = 0; i < num-1; i++)
 63             {
 64                 temp = Math.Round(random.NextDouble() * diffValue + min, 2);
 65                 sum += temp;
 66                 list.Add(temp);
 67             }
 68             //为了保证总额为指定值,须对最后一个数据的生成做处理
 69             double gap = totalValue-sum;
 70             if (gap >= min && gap <= max)
 71             {
 72                 list.Add(gap);
 73                 message = "success";
 74                 return list;
 75             }
 76             else if (gap > max)
 77             {//剩余值大于max
 78                 list.Add(max);
 79                 gap = gap - max;
 80                 int index;
 81                 double value;
 82                 while (gap > 0)
 83                 {
 84                     index = random.Next(num - 1);  //生成0到num-1之间的随机整数(包括0,不包括num-1)
 85                     value = list[index];
 86                     double margin = max - value;
 87                     if (margin>0)
 88                     {
 89                         if (gap >= margin)
 90                         {
 91                             list[index] = max;
 92                             gap = gap - margin;
 93                         }
 94                         else 
 95                         {
 96                             list[index] = list[index] + gap;
 97                             message = "success";
 98                             return list;
 99                         }
100                     }
101                 }
102             }
103             else //剩余值小于min
104             {
105                 list.Add(min);
106                 double need = min-gap;
107                 int index;
108                 double value;
109                 double buffer;
110                 while (need > 0)
111                 {
112                     index = random.Next(num - 1);  //生成0到num-1之间的随机整数(包括0,不包括num-1)
113                     value = list[index];
114                     buffer = value - min;
115                     if (buffer >= need)
116                     {
117                         list[index] = list[index] - need;
118                         message = "success";
119                         return list;
120                     }
121                     else
122                     {
123                         list[index] = min;
124                         need = need - buffer;
125                     }
126                 }
127             }
128             message = "success";
129             return list;
130         }
131 
132        
133     }

 

以上是关于红包算法的主要内容,如果未能解决你的问题,请参考以下文章

微信红包算法

撸一个拆红包动画

关于随机红包抽奖算法

一个效率比较高红包算法

[编程题] 微信红包

面试真题设计一个抢红包算法,单个红包最大不能超过总金额的90%