群裡都在玩搶紅包,搶了再發,發了再搶,簡直是無聊,程序員感興趣是的如何實現,這裡簡單說說實現思路,附上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;
}
本文已被整理到了《ASP.NET微信開發教程匯總》,歡迎大家學習閱讀。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。