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