红包算法
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 }
以上是关于红包算法的主要内容,如果未能解决你的问题,请参考以下文章