微信抢红包ASP.NET代码轻松实现

525 查看

群里都在玩抢红包,抢了再发,发了再抢,简直是无聊,程序员感兴趣是的如何实现,这里简单说说实现思路,附上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;
  }
/// <summary>
  /// 余数处理
  /// </summary>
  /// <param name="money"></param>
  /// <param name="list"></param>
  /// <returns></returns>
  public List<int> checklist(int money, int pjs, List<int> list)
  {
   if (money != 0)
   {
    if (money > 0)
    {

     List<int> list_order = maopao(list);
     //给最小
     if (money / pjs == 0)
     {      
      list_order[0] += money;
     }
     else
     {
      for (int i = 0; i < money / pjs + 1; i++)
      {
       if (i == money / pjs)
       {
        list_order[i] += (money - (money / pjs) * pjs);
       }
       else
       {
        list_order[i] += pjs;
       }

      }
     }
     return list_order;
    }
    else
    {

     List<int> list_order = maopao(list,"desc");
     //给最大
     if (money / pjs == 0)
     {

      list_order[0] += money;
     }
     else
     {
      for (int i = 0; i < -(money / pjs) + 1; i++)
      {
       if (i == -(money / pjs))
       {
        list_order[i] += (money - (money / pjs) * pjs);
       }
       else
       {
        list_order[i] -= pjs;
       }

      }
     }
     return list_order;
    }
   }
   return list;
  }

 /// <summary>
   /// 冒泡排序
   /// </summary>
   /// <param name="list"></param>
   /// <param name="order"></param>
   /// <returns></returns>
   public List<int> maopao(List<int> list,string order = "asc")
   {
    if (order != "asc")
    {
     for (int i = 0; i < list.Count; i++)
     {
      for (int j = 0; j < list.Count - i - 1; j++)
      {
       if (list[j + 1] > list[j])
      {
        int temp = list[j];
        list[j] = list[j + 1];
        list[j + 1] = temp;
 
       }
      }
     }
    }
    else 
   {
     for (int i = 0; i < list.Count; i++)
     {
      for (int j = 0; j < list.Count-i-1;j++)
      {
       if (list[j+1] < list[j])
       {
        int temp = list[j];
       list[j] = list[j+1];
       list[j+1] = temp;

      }
      }
    }
   }
   return list;
  }

/// <summary>
  /// 打乱顺序
   /// </summary>
   /// <param name="list"></param>
   /// <returns></returns>
  public List<int> suiji(List<int> list) 
   {
    Random rnd = new Random();
    for (int i = 0; i < list.Count; i++)
    {
     int temp = list[i];
     int j = rnd.Next(0, list.Count-1);
     list[i] = list[j];
     list[j] = temp;
    }
    return list;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。