搶紅包的問題

        最近比較忙,很久沒寫點東西了。上週公司年會,羣裏搶紅包,突發感想,寫一個搶紅包的小程序玩玩吧。下面來講一下要求和思路。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;     }

相關文章
相關標籤/搜索