JAVA實現仿微信紅包分配規則

來源:互聯網
上載者:User

JAVA實現仿紅包分配規則

最近過年發紅包拜年成為一種新的潮流,作為程式猿對演算法的好奇遠遠要大於對紅包的好奇,這裡介紹一種自己想到的一種隨機紅包分配策略,還請大家多多指教。

演算法介紹

一、紅包金額限制

對於紅包,我們知道沒人隨機的最小紅包是1分,最大金額是200元,這裡我們同樣來設定紅包的範圍,下面代碼我們統一金錢的單位為分。

 

//最小紅包額度private static final int MINMONEY = 1;//最大紅包額度private static final int MAXMONEY = 200 * 100;

二、判斷紅包金額是否合法

 

注意這一步伴隨著整個演算法,我們不僅要在分配紅包之前要判斷金額是否合法,同樣要在每個人暫訂隨機金額後也要判斷剩餘的金額是否合法。

 

private boolean isRight(int money, int count) {double avg = money / count;if (avg < MINMONEY) {return false;}if (avg > MAXMONEY) {return false;}return true;}

三、隨機產生一個紅包

 

這裡我們採用隨機的方式產生一個在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;}

四、實現紅包分配

 

這裡為了避免某一個紅包佔用大量資金,我們需要設定非最後一個紅包的最大金額,我們把他設定為紅包金額平均值的N倍;有了一、二、三中的方法,我們就可以來實現紅包的分配了。

 

//每個紅包最大是平均值的倍數private static final double TIMES = 2.1;   public List splitRedPackets(int money, int count) {if (!isRight(money, count)) {return null;}List list = new ArrayList();//紅包最大金額為平均金額的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 splitRedPackets(int money, int count) {if (!isRight(money, count)) {return null;}List list = new ArrayList();//紅包最大金額為平均金額的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)));}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.