发红包案例分析:(代码分析)
手气红包:
public class RandomMode implements OpenMode{
@Override
public ArrayList<Integer> divide(final int totalMoney, final int totalCount) {
ArrayList<Integer> arrayList = new ArrayList<>();
Random rnd = new Random();
int leftMoney = totalMoney;
int leftCount = totalCount;
for (int i = 0; i < totalCount-1; i++,leftCount--) {
int leftMoneys =1+ rnd.nextInt(leftMoney/leftCount)*2;//随机
arrayList.add(leftMoneys);//存入
leftMoney = totalMoney - leftMoneys;//错误写法
leftMoney = leftMoney - leftMoneys;//余额
}
arrayList.add(leftMoney);
return arrayList;
}
}
1+ random.nextInt(leftMoney/leftCount)*2; 和 random.nextInt(leftMoney/leftCount)*2; 我个人觉得没什么区别
1+ random.nextInt(leftMoney/leftCount)*2; 和 random.nextInt(leftMoney/leftCount)*2; 我个人觉得没什么区别
但事实上,这个1 是最少1分钱的意思,也就是抢红包的时候避免抢了0 分钱。所以我们有很多修改,比如:
int leftMoneyss =1+rnd.nextInt(leftMoney/leftCount-1)*2;//随机
那为什么括号里有个减1,是因为避免第二次发红包的时候,随机数的最大值大于余额。
public ArrayList<Integer> divide(final int totalMoney, final int totalCount) {
ArrayList<Integer> list = new ArrayList<>();
// 随机分配,有可能多,有可能少。
// 最少1分钱,最多不超过“剩下金额平均数的2倍”
// 第一次发红包,随机范围是0.01元~6.66元
// 第一次发完之后,剩下的至少是3.34元。
// 此时还需要再发2个红包
// 此时的再发范围应该是0.01元~3.34元(取不到右边,剩下0.01)
// 总结一下,范围的【公式】是:1 + random.nextInt(leftMoney / leftCount * 2);
Random r = new Random(); // 首先创建一个随机数生成器
// totalMoney是总金额,totalCount是总份数,不变
// 额外定义两个变量,分别代表剩下多少钱,剩下多少份
int leftMoney = totalMoney;
int leftCount = totalCount;
// 随机发前n-1个,最后一个不需要随机
for (int i = 0; i < totalCount - 1; i++) {
// 按照公式生成随机金额
int money = r.nextInt(leftMoney / leftCount * 2) + 1;
list.add(money); // 将一个随机红包放入集合
leftMoney -= money; // 剩下的金额越发越少
leftCount--; // 剩下还应该再发的红包个数,递减
}
// 最后一个红包不需要随机,直接放进去就得了
list.add(leftMoney);
return list;
}
普通红包:
public ArrayList<Integer> divide(final int totalMoney,final int totalCount) {
ArrayList<Integer> list = new ArrayList<>();
int avg = totalMoney / totalCount;//除数
int mod = totalMoney % totalCount;//余数,零头
for (int i = 0; i < totalCount-1; i++) {
list.add(avg);
}
list.add(mod+avg);//最后一个红包发给最后一个人
System.out.println(list);//在控制台显示
return list;//返回数组
}