抢红包的问题

        最近比较忙,很久没写点东西了。上周公司年会,群里抢红包,突发感想,写一个抢红包的小程序玩玩吧。下面来讲一下要求和思路。java

         此处用例子说明:假设发10我的的随机红包,总额100元。小程序

         要求:一、全部的人必须都能领到红包(不能说谁领到了0分)。数组

                  二、全部人领完以后,总额必须等于红包总额(不能领完了还剩几块钱这样的)。dom

         思路:一、把总额(元)换成分为单位,分计算起来比较方便。.net

                   二、把总分,划分人数减1个断点,这样就分红了10份。排序

                   三、每一个人领取其中一份。ip

         下面能够看一下代码:        ci

package test;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
public class RedBag {
    public static void main(String[] args) throws Exception {
        // 此处 默认 10我的 分100元 即10000分
        ArrayList<Double> resultList = getAll(10, 100);
        //此处为验证总数  
        double sum = 0;
        for (double d : resultList) {
            sum += d;
            System.out.println(d);
        }
        System.out.println(sum);
    }get

    // money 为元为单位
    public static ArrayList<Double> getAll(int peopleNum, double money) {
        /* 
         * 换成分    这里会出现精度问题
         * 
         * 使用bigDecimal 能够解决部分状况,可是最后求和那里还会出现 精度问题(固然,这个并不影响分的红包)
         * 
         * */
        BigDecimal mm = new BigDecimal(money + "");
        int total = mm.multiply(new BigDecimal(100)).intValue();
        System.out.println(total);
        // 用于返回
        ArrayList<Double> rList = new ArrayList<Double>();
        // 10我的 分9分
        HashSet<Integer> set = getRand(peopleNum - 1, total);
        // set 变数组 
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int ii : set) {
            list.add(ii);
        }
        // 排序后,两个数之间差值,就是分的钱数的分数了。
        Collections.sort(list);
        // 第一个
        rList.add(list.get(0) / 100.0);
        for (int i = 1; i < list.size(); i++) {
            rList.add((list.get(i) - list.get(i - 1)) / 100.0);
        }
        // 最后一个
        rList.add((total - list.get(list.size() - 1)) / 100.0);
        return rList;
    }
    
    //生成在 一到总分数之间的随机数字,并保证个数(虽说随机数字重复概率不大,可是也要预防,防止出现0分状况)
    public static HashSet<Integer> getRand(int num, int times) {
        HashSet<Integer> set = new HashSet<Integer>();
        while (set.size() < num) {
            int one = (int) (Math.random() * (times - 1) + 1);
            set.add(one);
        }
        return set;
    }
}io

        最后,感谢月影南溪同窗,提议全部的都用分(整数来处理),全部里面的是分,确实能够省却不少处理。谢谢。同时,很开心和你们一块儿写程序。

        能够整理为这个。

public static void main(String[] args) throws Exception {
        // 此处 默认 10我的 分135.45元 即13545分
        ArrayList<Integer> resultList = getAll(10, 13545);
        //此处为验证总数  
        int sum = 0;
        for (Integer d : resultList) {
            sum += d;
            System.out.println(d);
        }
        System.out.println(sum);
    }

    // money 分为单位     public static ArrayList<Integer> getAll(int peopleNum, int money) {         // 用于返回         ArrayList<Integer> rList = new ArrayList<Integer>();         // 10我的 分9分         HashSet<Integer> set = getRand(peopleNum - 1, money);         // set 变数组          ArrayList<Integer> list = new ArrayList<Integer>();         for (int ii : set) {             list.add(ii);         }         // 排序后,两个数之间差值,就是分的钱数的分数了。         Collections.sort(list);         // 第一个         rList.add(list.get(0));         for (int i = 1; i < list.size(); i++) {             rList.add(list.get(i) - list.get(i - 1));         }         // 最后一个         rList.add(money - list.get(list.size() - 1));         return rList;     }          //生成在 一到总分数之间的随机数字,并保证个数(虽说随机数字重复概率不大,可是也要预防,防止出现0分状况)     public static HashSet<Integer> getRand(int num, int times) {         HashSet<Integer> set = new HashSet<Integer>();         while (set.size() < num) {             int one = (int) (Math.random() * (times - 1) + 1);             set.add(one);         }         return set;     }

相关文章
相关标签/搜索