Java完成仿微信紅包分派規矩。本站提示廣大學習愛好者:(Java完成仿微信紅包分派規矩)文章只能為提供參考,不一定能成為您想要的結果。以下是Java完成仿微信紅包分派規矩正文
比來過年發紅包賀年成為一種新的潮水,作為法式猿對算法的獵奇遠遠要年夜於對紅包的獵奇,這裡引見一種本身想到的一種隨機紅包分派戰略,還請年夜家多多指教。
算法引見
1、紅包金額限制
關於微信紅包,我們曉得沒人隨機的最小紅包是1分,最年夜金額是200元,這裡我們異樣來設置紅包的規模,上面代碼我們同一金錢的單元為分。
//最小紅包額度 private static final int MINMONEY = 1; //最年夜紅包額度 private static final int MAXMONEY = 200 * 100;
2、斷定紅包金額能否正當
留意這一步隨同著全部算法,我們不只要在分派紅包之前要斷定金額能否正當,異樣要在每一個人暫定隨機金額後也要斷定殘剩的金額能否正當。
private boolean isRight(int money, int count) { double avg = money / count; if (avg < MINMONEY) { return false; } if (avg > MAXMONEY) { return false; } return true; }
3、隨機發生一個紅包
這裡我們采取隨機的方法發生一個在MINMONEY和MAXMONEY之間的一個紅包,發生紅包以後,我們須要斷定殘剩的錢能否是正當紅包,假如不是正當紅包,我們就從新發生分派計劃,在從新發生分派計劃的時刻,我們須要肯定一個工作,是發生的紅包過年夜照樣太小,假如紅包過年夜,下次就隨機一個小值到本次紅包金額的一個紅包,假如紅包金額太小,我們就發生一個紅包金額到年夜值的一個紅包。
private int random(int money, int minS, int maxS, int count) { //紅包數目為1,直接前往金額 if (count == 1) { return money; } //假如最年夜金額和最小金額相等,直接前往金額 if (minS == maxS) { return minS; } int max = maxS > money ? money : maxS; //隨機發生一個紅包 int one = ((int)Math.rint(Math.random() * (max - minS) + minS)) % max + 1; int money1 = money - one; //斷定該種分派計劃能否准確 if (isRight(money1, count -1)) { return one; } else { double avg = money1 / (count - 1); if (avg < MINMONEY) { //遞歸挪用,修正紅包最年夜金額 return random(money, minS, one, count); }else if (avg > MAXMONEY) { //遞歸挪用,修正紅包最小金額 return random(money, one, maxS, count); } } return one; }
4、完成紅包分派
這裡為了不某一個紅包占用年夜量資金,我們須要設定非最初一個紅包的最年夜金額,我們把他設置為紅包金額均勻值的N倍;有了1、2、三中的辦法,我們便可以來完成紅包的分派了。
//每一個紅包最年夜是均勻值的倍數 private static final double TIMES = 2.1; public List<Integer> splitRedPackets(int money, int count) { if (!isRight(money, count)) { return null; } List<Integer> list = new ArrayList<Integer>(); //紅包最年夜金額為均勻金額的TIMES倍 int max = (int) (money * TIMES / count); max = max > MAXMONEY ? MAXMONEY : max; for (int i = 0; i < count; i++) { int one = random(money, MINMONEY, max, count - i); list.add(one); money -= one; } return list; }
紅包分派計劃評價
下面引見了紅包的根本算法,上面我們就對算法停止一次驗證,假定有一個200元100份的紅包,我們來看一下最初的分派計劃。
完全代碼
/** *@Description: */ package com.lulei.weixin.util; import java.util.ArrayList; import java.util.List; import com.lulei.util.JsonUtil; public class RedPacketUtil { //最小紅包額度 private static final int MINMONEY = 1; //最年夜紅包額度 private static final int MAXMONEY = 200 * 100; //每一個紅包最年夜是均勻值的倍數 private static final double TIMES = 2.1; /** * @param money * @param count * @return * @Author:lulei * @Description: 拆分紅包 */ public List<Integer> splitRedPackets(int money, int count) { if (!isRight(money, count)) { return null; } List<Integer> list = new ArrayList<Integer>(); //紅包最年夜金額為均勻金額的TIMES倍 int max = (int) (money * TIMES / count); max = max > MAXMONEY ? MAXMONEY : max; for (int i = 0; i < count; i++) { int one = random(money, MINMONEY, max, count - i); list.add(one); money -= one; } return list; } /** * @param money * @param minS * @param maxS * @param count * @return * @Author:lulei * @Description: 隨機紅包額度 */ private int random(int money, int minS, int maxS, int count) { //紅包數目為1,直接前往金額 if (count == 1) { return money; } //假如最年夜金額和最小金額相等,直接前往金額 if (minS == maxS) { return minS; } int max = maxS > money ? money : maxS; //隨機發生一個紅包 int one = ((int)Math.rint(Math.random() * (max - minS) + minS)) % max + 1; int money1 = money - one; //斷定該種分派計劃能否准確 if (isRight(money1, count -1)) { return one; } else { double avg = money1 / (count - 1); if (avg < MINMONEY) { //遞歸挪用,修正紅包最年夜金額 return random(money, minS, one, count); }else if (avg > MAXMONEY) { //遞歸挪用,修正紅包最小金額 return random(money, one, maxS, count); } } return one; } /** * @param money * @param count * @return * @Author:lulei * @Description: 此種紅包能否正當 */ private boolean isRight(int money, int count) { double avg = money / count; if (avg < MINMONEY) { return false; } if (avg > MAXMONEY) { return false; } return true; } public static void main(String[] args) { // TODO Auto-generated method stub RedPacketUtil util = new RedPacketUtil(); System.out.println(JsonUtil.parseJson(util.splitRedPackets(20000, 100))); } }
以上就是本文的全體內容,願望對年夜家進修java法式設計有所贊助。