前言程序員
羣裏都在玩搶紅包,搶了再發,發了再搶,簡直是無聊,程序員感興趣是的如何實現,這裏簡單說說實現思路,附上dome,代碼有點low,好在是實現了,感興趣的園友能夠完善下,以爲還行的能夠點個贊dom
正文ide
直接進入主題,先附上幾張效果圖(缺陷)ui
====================100塊發30個紅包============================spa
====================50塊發13個紅包============================3d
====================1塊發10個紅包============================code
=========================================================blog
發紅包須要知足如下幾個條件排序
1.總金額不變遞歸
2.每一個紅包都必須有錢
3.儘可能的均勻點,否則搶紅包沒什麼意思了
=========================================================
實現思路
1.首先要肯定最小單位,這裏是精確到分,我這裏以int類型進行計算,得出的結果也全是int類型
2.數據均勻,這裏以 1<n<(剩餘金額/剩餘紅包數)*2,這裏防止一個紅包搶走大量的錢,這裏須要寫個遞歸,去檢查數據值是否過大,50元發13個紅包的第3圖,就是由於沒有檢查數據,致使錢不平均,這個能夠根據本身的玩法去設置.
3.餘數處理,當數據平均給20個紅包,確定跟總金額有所誤差,這時候咱們就要多退少補,若是大於總金額,讓紅包金額多的去減小(總金額/總人數),若是還有剩餘,就讓第二多的去減小,直到補完這個空缺爲止,反之亦然.
4.打亂順序,細心的園友可能發現,紅包是有順序規律的,咱們必須簡單的寫個function去打亂它.
=========================================================
demo
/// <summary> /// 搶紅包 /// </summary> /// <param name="money"></param> /// <param name="num"></param> /// <returns></returns> public List<int> qhb(int money, int num) { int min = 1; int pjs = money / num; List<int> list = new List<int>(); Random rnd = new Random(); for (int i = 0; i < num; i++) { int max = (money / (num - i)) * 2; int s = rnd.Next(min, max); s = checkmoney(s, min, max); list.Add(s); money -= s; } //前面數據都是合理的,結尾必須多退少補 list = checklist(money, pjs, list); return list; }
1 /// <summary> 2 /// 獲取到合理數據 3 /// </summary> 4 /// <param name="i"></param> 5 /// <param name="min"></param> 6 /// <param name="max"></param> 7 /// <returns></returns> 8 public int checkmoney(int i, int min, int max) 9 { 10 if (i > max || i < min) 11 { 12 Random rnd = new Random(); 13 i = rnd.Next(min, max); 14 return checkmoney(i, min, max); 15 } 16 return i; 17 }
1 /// <summary> 2 /// 餘數處理 3 /// </summary> 4 /// <param name="money"></param> 5 /// <param name="list"></param> 6 /// <returns></returns> 7 public List<int> checklist(int money, int pjs, List<int> list) 8 { 9 if (money != 0) 10 { 11 if (money > 0) 12 { 13 14 List<int> list_order = maopao(list); 15 //給最小 16 if (money / pjs == 0) 17 { 18 list_order[0] += money; 19 } 20 else 21 { 22 for (int i = 0; i < money / pjs + 1; i++) 23 { 24 if (i == money / pjs) 25 { 26 list_order[i] += (money - (money / pjs) * pjs); 27 } 28 else 29 { 30 list_order[i] += pjs; 31 } 32 33 } 34 } 35 return list_order; 36 } 37 else 38 { 39 40 List<int> list_order = maopao(list,"desc"); 41 //給最大 42 if (money / pjs == 0) 43 { 44 45 list_order[0] += money; 46 } 47 else 48 { 49 for (int i = 0; i < -(money / pjs) + 1; i++) 50 { 51 if (i == -(money / pjs)) 52 { 53 list_order[i] += (money - (money / pjs) * pjs); 54 } 55 else 56 { 57 list_order[i] -= pjs; 58 } 59 60 } 61 } 62 return list_order; 63 } 64 } 65 return list; 66 }
1 /// <summary> 2 /// 冒泡排序 3 /// </summary> 4 /// <param name="list"></param> 5 /// <param name="order"></param> 6 /// <returns></returns> 7 public List<int> maopao(List<int> list,string order = "asc") 8 { 9 if (order != "asc") 10 { 11 for (int i = 0; i < list.Count; i++) 12 { 13 for (int j = 0; j < list.Count - i - 1; j++) 14 { 15 if (list[j + 1] > list[j]) 16 { 17 int temp = list[j]; 18 list[j] = list[j + 1]; 19 list[j + 1] = temp; 20 21 } 22 } 23 } 24 } 25 else 26 { 27 for (int i = 0; i < list.Count; i++) 28 { 29 for (int j = 0; j < list.Count-i-1;j++) 30 { 31 if (list[j+1] < list[j]) 32 { 33 int temp = list[j]; 34 list[j] = list[j+1]; 35 list[j+1] = temp; 36 37 } 38 } 39 } 40 } 41 return list; 42 }
1 /// <summary> 2 /// 打亂順序 3 /// </summary> 4 /// <param name="list"></param> 5 /// <returns></returns> 6 public List<int> suiji(List<int> list) 7 { 8 Random rnd = new Random(); 9 for (int i = 0; i < list.Count; i++) 10 { 11 int temp = list[i]; 12 int j = rnd.Next(0, list.Count-1); 13 list[i] = list[j]; 14 list[j] = temp; 15 } 16 return list; 17 }