程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java完成仿微信紅包分派規矩

Java完成仿微信紅包分派規矩

編輯:關於JAVA

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved