微信搶紅包的簡單實現


前言

  群里都在玩搶紅包,搶了再發,發了再搶,簡直是無聊,程序員感興趣是的如何實現,這里簡單說說實現思路,附上dome,代碼有點low,好在是實現了,感興趣的園友可以完善下,覺得還行的可以點個贊

正文

  直接進入主題,先附上幾張效果圖(缺陷)

  

  ====================100塊發30個紅包============================

  

  ====================50塊發13個紅包============================

  

  ====================1塊發10個紅包============================

  

  =========================================================

  發紅包需要滿足以下幾個條件

  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;
        }
View Code

 

 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         }
View Code

 

 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         }
View Code

 

 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         }
View Code

 

 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         }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM