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