权限篇二(红包案例)仅代码

发红包案例分析:(代码分析)

手气红包:

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;//返回数组
}
发布了98 篇原创文章 · 获赞 43 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_42352666/article/details/104699402