模拟拼手气红包
* 对于指定总金额以及红包个数,可以生成不同金额的红包,
*,每个红包金额随机生成。
* 分析这个题目:
* 1.首先需要一个分发红包的方法.输入的参数是 总金额 以及 红包个数.
* 按照这两个参数生成不同金额的(double)类型的红包,存放进ArrayList中.
* 2.然后需要抢红包的方法.直接就可以从ArrayList中随机拿走一个红包
* 3.只要是一个人,就能发红包和 抢红包,那么发红包和抢红包是属于人类的一种基本行为.
* 当然只要账户里有钱,就可以发.没钱提示"腾讯红包,没钱玩你麻痹"
首先定义一个Person类,完善类的成员变量,成员行为,构造方法,getter&setter方法..
1 package HongBaoAnLi; 2 import java.math.BigDecimal; 3 import java.util.ArrayList; 4 import java.util.Random; 5 import static javafx.application.Platform.exit; 6 /* 7 * 在红包案例中,人具备两种属性:姓名/钱 8 * 人具备两种行为.查看用户的余额/收红包/发红包 9 * */ 10 public class Person { 11 //成员属性 12 private String name; 13 private double money; 14 //成员行为 15 //显示我有多少钱 16 public void show(){ 17 System.out.printf("用户名:%s 账户余额%f\n",name,money); 18 } 19 //发红包行为 20 /* 21 * 分发红包思路: 22 * 23 * 步骤1. 该分发红包的方法接受两个参数:红包总金额totalMoney,红包拆分的个数count 24 * 如果红包金额存在小数,需要将小数位分离出来,分成整数部分 MoneyInt 和 小数部分 decimalPart. 25 * 步骤2. 将总金额分成N个红包,那我们先包好N-1个红包,每个红包随机赋予(0,MoneyInt)之间的值 26 * 步骤3. 然后用金额上限/红包总额 得到一个系数. 27 * 步骤4. 将每个红包的值 * 系数 = 每个红包的实际值 28 * 红包1:1*0.666=0.666 红包2:2*0.666 = 1.333 红包3:3*0.666=1.999 29 * 步骤5. 最后一个红包的值 = 总的红包金额 - 红包1-红包2-红包3 + 步骤一拆分的余数; 30 * 31 * 举例说明:假设totalMoney为10.5,分成3个包.先将10.5拆分成 10 和 0.5 32 * 以10为基准,随机生成0-10的数字赋给红包1和2,比如红包1的值为4,红包2的值为8 33 * 10/(4+8) = 0.8333 34 * 红包1:4*0.8333=3.3333 红包2:8*0.8333=6.666 35 * 那么红包3的值 = MoneyInt - 红包1 - 红包2 + decimalPart.|| 红包3=10-3.3333-6.666+0.5 =0.5007 36 * */ 37 public ArrayList<BigDecimal> send(double totalMoney, int count){ 38 /* 39 * 前一个arrayList类型为Double用来划分红包的金额 40 * 后一个arrayDB用来精确计算,计算数据来源于arrayList的成员.保留两位小数. 41 * 返回BigDecimal类型的集合对象. 42 * */ 43 ArrayList<Double> arrayList = new ArrayList<>(); 44 ArrayList<BigDecimal> araryBD = new ArrayList<>(); 45 //首先看发红包的人有多少钱,钱不足直接提示/退出.钱够了就开始发红包. 46 double leftmoney = this.getMoney(); 47 if (totalMoney>leftmoney) { 48 System.out.println("对不起您的账户余额不足,请先充值!\n腾讯业务,没钱用你麻痹!"); 49 exit(); 50 51 } 52 else { 53 System.out.println("╔═══════════════════════════╗"); 54 System.out.printf("╬ 用户名:[%s]的用户派发了[%.2f]元的口令红包! \n",this.getName(),totalMoney); 55 System.out.println("╬ 请速来领取!! "); 56 System.out.println("╚═══════════════════════════╝"); 57 } 58 //扣钱,本质就是重新对money属性进行改写 59 this.setMoney(leftmoney-totalMoney); 60 //发红包拆分成count份数,每份的金额不定 61 //红包不一定是整数,如果有人非要发带小数的红包,那么我们将小数位分离出来. 62 double decimalPart = totalMoney - (int)totalMoney; 63 //单独分理出小数,就可以直接处理整数部分了.赋给变量moneyInt 64 int moneyInt = (int)(totalMoney); 65 Random ra = new Random(); 66 double temp=0,sumNum=0; 67 /*步骤2. 将总金额分成N个红包,那我们先包好N-1个红包, 68 每个红包随机赋予(0,MoneyInt)之间的值*/ 69 for (int i = 0; i < count; i++) { 70 temp = (double)ra.nextInt(moneyInt); 71 arrayList.add(temp); 72 sumNum+=temp; 73 } 74 /* * 步骤3. 然后用金额上限/红包总额 得到一个系数.*/ 75 double xishu = moneyInt/sumNum; 76 /*定义与系数运算后的接受变量numAfter/sumAfter */ 77 double numAfter=0,sumAfter=0; 78 for (int i = 0; i < count-1; i++) { 79 /** 步骤4. 将每个红包的值 * 系数 = 每个红包的实际值*/ 80 numAfter = arrayList.get(i)*xishu; 81 arrayList.set(i,numAfter); 82 //将numAfter传递给BigDecimal类,需要将浮点数转换成字符串 83 String str = numAfter+""; 84 BigDecimal decimal = new BigDecimal(str); 85 BigDecimal setScale1 = decimal.setScale(2,BigDecimal.ROUND_HALF_UP); 86 //将decimal添加到BigDecimal类的集合中 87 araryBD.add(setScale1); 88 sumAfter+=numAfter; 89 } 90 //初始化最后一个红包的值为0 91 double finalNum =0; 92 /*步骤5. 最后一个红包的值 = 总的红包金额 - 红包1-红包2-红包3 + 步骤一拆分的余数;*/ 93 finalNum = (double)moneyInt-sumAfter+decimalPart; 94 // arrayList.set(count-1,finalNum); 95 /*将最后一个红包的值转换为String类型的对象,然后传递给BigDecimal 96 * 用过setScale();方法将结果保留两位小数,采用ROUND_HALF_UP参数,也就是所谓的四舍五入. 97 * */ 98 String strFinal = finalNum+""; 99 BigDecimal decima2 = new BigDecimal(strFinal); 100 BigDecimal setScale2 = decima2.setScale(2,BigDecimal.ROUND_HALF_UP); 101 /*将四舍五入后的结果添加到arrayBD中*/ 102 araryBD.add(setScale2); 103 104 System.out.println(" 使用BigDecimal"); 105 System.out.println(araryBD); 106 107 return araryBD; 108 } 109 //收红包方法 110 public void receiver(ArrayList<BigDecimal> list){ 111 112 //从多个红包重随机抽取一个给自己 113 //随机获取一个集合当中的索引编号 114 int index = new Random().nextInt(list.size()); 115 //将BigDecimal转换成deouble类型数据 116 double tempValue = list.get(index).doubleValue(); 117 System.out.printf("用户名为:[%s]的用户抢到了[%.2f]元!,抢之前的余额为[%.2f]",this.getName(),tempValue,this.getMoney()); 118 // System.out.printf("\t\t红包号为%d内容%.2f元!\n",++numCount,tempValue); 119 //删除索引的元素 120 list.remove(index); 121 //当前成员自身有的钱 122 double money = getMoney(); 123 //将得到的红包 + 自身当前 124 this.setMoney(money+tempValue); 125 System.out.printf("\t抢之后的余额为[%.2f]\n",money+tempValue); 126 } 127 //构造方法 128 public Person() { 129 } 130 131 public Person(String name, int money) { 132 this.name = name; 133 this.money = money; 134 } 135 //getter和setter方法 136 137 public String getName() { 138 return name; 139 } 140 141 public void setName(String name) { 142 this.name = name; 143 } 144 145 public double getMoney() { 146 return money; 147 } 148 149 public void setMoney(double money) { 150 this.money = money; 151 } 152 }
然后创建一个MainClass类对Person类实例化,查看运行结果.
1 package HongBaoAnLi; 2 import java.math.BigDecimal; 3 import java.util.ArrayList; 4 /* 5 *//* 6 * 模拟拼手气红包: 7 * 对于指定总金额以及红包个数,可以生成不同金额的红包, 8 *,每个红包金额随机生成。 9 ***************************************************( 10 * 分析这个题目: 11 * 1.首先需要一个分发红包的方法.输入的参数是 总金额 以及 红包个数. 12 * 按照这两个参数生成不同金额的(double)类型的红包,存放进ArrayList中. 13 * 2.然后需要抢红包的方法.直接就可以从ArrayList中随机拿走一个红包 14 * 3.是个人,就能发红包和 抢红包,那么发红包和抢红包是属于人类的一种基本行为. 15 * 当然只要账户里有钱,就可以发.没钱提示"腾讯红包,没钱玩你麻痹" 16 * 17 * */ 18 public class MainClass { 19 public static void main(String[] args) { 20 System.out.println("\n======抢红包之前======"); 21 Person manager = new Person("管理员",500); 22 Person member1 = new Person("成员A",0); 23 Person member2 = new Person("成员B",0); 24 Person member3 = new Person("成员C",0); 25 Person member4 = new Person("成员D",0); 26 /*显示出当前所有成员的状态信息:用户名以及剩余金额.*/ 27 manager.show(); 28 member1.show(); 29 member2.show(); 30 member3.show(); 31 member4.show(); 32 System.out.println("\n======抢红包之后======"); 33 34 /*调用send(totalMoney,couunt)方法发红包,传递的两个参数分别为红包的总金额,红包划分的个数.*/ 35 ArrayList<BigDecimal> redList = manager.send(100.5,5); 36 37 /*调用receiver(ArrayList redList)方法抢红包,该方法自带显示金额等信息直接调用就可以看到结果.*/ 38 manager.receiver(redList); 39 member1.receiver(redList); 40 member2.receiver(redList); 41 member3.receiver(redList); 42 member4.receiver(redList); 43 } 44 }
运行结果: