微信搶紅包ASP.NET代碼輕松實(shí)現(xiàn)
群里都在玩搶紅包,搶了再發(fā),發(fā)了再搶,簡直是無聊,程序員感興趣是的如何實(shí)現(xiàn),這里簡單說說實(shí)現(xiàn)思路,附上dome,代碼有點(diǎn)low,好在是實(shí)現(xiàn)了,具體內(nèi)容如下
正文
100塊發(fā)30個(gè)紅包




50塊發(fā)13個(gè)紅包





1塊發(fā)10個(gè)紅包





發(fā)紅包需要滿足以下幾個(gè)條件
1.總金額不變
2.每個(gè)紅包都必須有錢
3.盡量的均勻點(diǎn),不然搶紅包沒什么意思了
實(shí)現(xiàn)思路
1.首先要確定最小單位,這里是精確到分,我這里以int類型進(jìn)行計(jì)算,得出的結(jié)果也全是int類型
2.數(shù)據(jù)均勻,這里以 1<n<(剩余金額/剩余紅包數(shù))*2,這里防止一個(gè)紅包搶走大量的錢,這里需要寫個(gè)遞歸,去檢查數(shù)據(jù)值是否過大,50元發(fā)13個(gè)紅包的第3圖,就是因?yàn)闆]有檢查數(shù)據(jù),導(dǎo)致錢不平均,這個(gè)可以根據(jù)自己的玩法去設(shè)置.
3.余數(shù)處理,當(dāng)數(shù)據(jù)平均給20個(gè)紅包,肯定跟總金額有所偏差,這時(shí)候我們就要多退少補(bǔ),如果大于總金額,讓紅包金額多的去減少(總金額/總?cè)藬?shù)),如果還有剩余,就讓第二多的去減少,直到補(bǔ)完這個(gè)空缺為止,反之亦然.
4.打亂順序,細(xì)心的園友可能發(fā)現(xiàn),紅包是有順序規(guī)律的,我們必須簡單的寫個(gè)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;
}
//前面數(shù)據(jù)都是合理的,結(jié)尾必須多退少補(bǔ)
list = checklist(money, pjs, list);
return list;
}
/// <summary>
/// 余數(shù)處理
/// </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微信開發(fā)教程匯總》,歡迎大家學(xué)習(xí)閱讀。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Silverlightbutton圖片切換樣式實(shí)例代碼
這篇文章介紹了Silverlightbutton圖片切換樣式實(shí)例代碼,有需要的朋友可以參考一下2013-11-11
實(shí)例解析Java中的synchronized關(guān)鍵字與線程安全問題
首先要清楚的是synchronized鎖住的不是代碼而是對象,因而在編寫相關(guān)的代碼塊時(shí)要注意線程同步安全問題,下面就來以實(shí)例解析Java中的synchronized關(guān)鍵字與線程安全問題2016-06-06
ASP.NET用DataSet導(dǎo)出到Excel的方法
ASP.NET用DataSet導(dǎo)出到Excel的方法,需要的朋友可以參考一下2013-03-03
VS2017添加EF的MVC控制器報(bào)錯(cuò)的解決方法
這篇文章主要為大家詳細(xì)介紹了VS2017添加EF的MVC控制器報(bào)錯(cuò)的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
.NET微服務(wù)架構(gòu)CI/CD自動(dòng)構(gòu)建Jenkins+Gitee
這篇文章介紹了.NET使用微服務(wù)架構(gòu)CI/CD自動(dòng)構(gòu)建Jenkins+Gitee的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
由于擴(kuò)展配置問題而無法提供您請求的頁面錯(cuò)誤解決方法
這篇文章主要介紹了由于擴(kuò)展配置問題而無法提供您請求的頁面錯(cuò)誤解決方法,需要的朋友可以參考下2014-05-05

