微信红包的随机逻辑源码

  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. /** 
  5.  * Created by Spirit on 2017/1/23. 
  6.  */  
  7. public class RedEnvelopesDemo {  
  8.     //红包最小值  
  9.     private static final float MINVALUE = 0.01F;  
  10.     //红包最大值  
  11.     private static final float MAXVALUE = 200F;  
  12.   
  13.     /** 
  14.      * 这里为了避免某一个红包占用大量资金,我们需要设定非最后一个红包的最大金额,我们把他设置为红包金额平均值的N倍; 
  15.      */  
  16.     private static final float TIMES = 2.1F;  
  17.   
  18.     /** 
  19.      * 判断红包是否合情理 
  20.      * @param money 
  21.      * @param count 
  22.      * @return 
  23.      */  
  24.     public boolean isRight(float money,int count) {  
  25.         float avg = money/count;  
  26.         if(avg < MINVALUE) {  
  27.             return false;  
  28.         } else if(avg > MAXVALUE) {  
  29.             return false;  
  30.         }  
  31.         return true;  
  32.     }  
  33.   
  34.     /** 
  35.      * 分红包核心算法 
  36.      * @param money 
  37.      * @param minS 
  38.      * @param maxS 
  39.      * @param count 
  40.      * @return 
  41.      */  
  42.     public float randomRedPacket(float money,float minS,float maxS,int count) {  
  43.         //当人数剩余一个时,把当前剩余全部返回  
  44.         if(count == 1) {  
  45.             return money;  
  46.         }  
  47.         //如果当前最小红包等于最大红包,之间返回当前红包  
  48.         if(minS == maxS) {  
  49.             return minS;  
  50.         }  
  51.         float max = maxS>money?money:maxS;  
  52.         //随机产生一个红包  
  53.         float one = (float)(Math.random()*(max-minS)+minS);  
  54.         float balance = money - one;  
  55.         //判断此次分配后,后续是否合理  
  56.         if(isRight(balance,count-1)) {  
  57.             return one;  
  58.         } else {  
  59.             //重新分配  
  60.             float avg = balance/(count-1);  
  61.             //如果本次红包过大,导致下次不够分,走这一条  
  62.             if(avg < MINVALUE) {  
  63.                 return randomRedPacket(money, minS, one, count);  
  64.             } else {  
  65.                 return randomRedPacket(money, one, maxS, count);  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     /** 
  71.      * 分红包 
  72.      * @param money 
  73.      * @param count 
  74.      * @return 
  75.      */  
  76.     public List<Float> spiltRedPackets(float money,int count) {  
  77.         //首先判断红包是否合情理  
  78.         if(!isRight(money,count)) {  
  79.             return null;  
  80.         }  
  81.         List<Float> list = new ArrayList<Float>();  
  82.         float max = money/count*TIMES;  
  83.         max = max>money?money:max;  
  84.         for(int i = 0 ; i < count; i++) {  
  85.             float value = randomRedPacket(money,MINVALUE,max,count-i);  
  86.             list.add(value);  
  87.             money -= value;  
  88.         }  
  89.         return list;  
  90.     }  
  91.   
  92.     public static void main(String[] args) {  
  93.         RedEnvelopesDemo red = new RedEnvelopesDemo();  
  94.         System.out.println(red.spiltRedPackets(150,10));  
  95.     }  
  96. }  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值