微信红包算法TEST

1、基本算法

设定总金额为10元,有N个人随机领取:
N=1
则红包金额=X元;

N=2
为保证第二个红包可以正常发出,第一个红包金额=0.01至9.99之间的某个随机数
第二个红包=10-第一个红包金额;

N=3
红包1=0.01至0.98之间的某个随机数
红包2=0.01至(10-红包1-0.01)的某个随机数
红包3=10-红包1-红包2

……

2、java代码

 1 package Demo_1.Test_1;
 2 
 3 import java.math.BigDecimal;
 4 import java.util.Random;
 5 
 6 /**
 7  * @描述:微信红包算法TEST
 8  * @author BrokenColor
 9  * @date 2017年3月2日上午11:27:36
10  */
11 public class WeixinHB {
12 
13     double TOTAL = 10;//红包总金额
14     int NUM = 8;//抢红包人数
15     double MIN = 0.01;//每人最少分的金额
16     double safe_total ;
17     double money ;
18     Random rand = new Random();
19     public void calculation(){
20         for (int i = 1; i < NUM; i++) {
21             
22             safe_total = (TOTAL-(NUM-i)*MIN)/(NUM-i);//计算安全上限
23             
24             money = rand.nextDouble()*(safe_total-MIN)+MIN;
25             
26             money =(double)Math.round(money*100)/100;//保留两位小数
27             
28             //直接相减会有double数据类型相减的问题
29             TOTAL = this.sub(TOTAL, money);
30             
31             System.out.println("第"+i+"次红包:"+money+"元,剩余:"+TOTAL+"元");
32         }
33         System.out.println("第"+NUM+"次红包:"+TOTAL+"元,剩余:0元");
34     }
35     //double 数相减
36      public double sub(double d1,double d2){ 
37          BigDecimal bd1 = new BigDecimal(Double.toString(d1)); 
38          BigDecimal bd2 = new BigDecimal(Double.toString(d2)); 
39          return bd1.subtract(bd2).doubleValue(); 
40      } 
41     
42     public static void main(String[] args) {
43         // TODO Auto-generated method stub
44         WeixinHB hb = new WeixinHB();
45         hb.calculation();
46     }
47 
48 }

结果:

第1次红包:1.38元,剩余:8.62元
第2次红包:1.11元,剩余:7.51元
第3次红包:1.14元,剩余:6.37元
第4次红包:0.31元,剩余:6.06元
第5次红包:1.52元,剩余:4.54元
第6次红包:0.93元,剩余:3.61元
第7次红包:2.34元,剩余:1.27元
第8次红包:1.27元,剩余:0元

 如有错误,望指出!

仅做笔记,如有错误之处,望指出
原文地址:https://www.cnblogs.com/brokencolor/p/6490181.html