微信红包算法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元
如有错误,望指出!
仅做笔记,如有错误之处,望指出