그룹의 모든 사람들이 빨간 봉투를 집고, 보내고, 다시 집는 게임을 하고 있습니다. 프로그래머들은 이를 어떻게 구현하는지에 관심이 있습니다. 구현 아이디어에 대한 간략한 소개와 돔이 첨부되어 있는데 다행히 구현이 되었네요. 구체적인 내용은
텍스트
100장 30장 빨간 봉투
50위안짜리 빨간 봉투 13개
블록당 빨간 봉투 10개
다음 조건을 충족해야 합니다. 빨간 봉투 발행
1. 총액은 변함이 없습니다
2. 각각의 빨간 봉투에는 돈이 있어야 합니다
3. 빨간 봉투 집기
구현 아이디어
우선, 가장 작은 단위를 결정해야 합니다. 여기서는 분 단위로 정확합니다. 여기서 계산을 위해 int 유형을 사용하고 결과는 모두 int 유형입니다
2. 데이터는 균일합니다. 여기서는 1
4. 순서를 잘 섞어서 친구들이 빨간 봉투가 순서대로 있는 것을 발견할 수도 있으니, 이를 방해하는 함수를 작성하면 됩니다.
데모
/// <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; }
위 내용은 WeChat 빨간 봉투 잡기 코드 예제의 ASP.NET 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!