微信拼手气红包,大家都体验过吧,多的就不说了,直接上代码:
import java.util.*;
/**
* 微信红包金额分配
* @Author: LiYang
* @Date: 2019/9/7 13:33
*/
public class RedPacketPuzzle {
/**
* 微信拼手气红包金额分配方案(输出结果为分,一分钱的分)
* @param cent 红包金额的分,5元钱就是500分
* @param person 抢红包的人数
* @return 红包金额分配方案
*/
public static List<Integer> moneyDistributor(int cent, int person){
if (cent <= 0){
throw new RuntimeException("红包金额应该是正数!");
}
if (person <= 0){
throw new RuntimeException("至少需要一个人来抢吧!");
}
if (cent < person){
throw new RuntimeException("钱不够分啊,老铁!");
}
//所有的分隔符号的集合
List<Integer> divideMark = new ArrayList<>();
//加入分隔符
for (int i = 1; i < cent; i++) {
divideMark.add(i);
}
//乱序分隔符,以求得随机
Collections.shuffle(divideMark);
//所需的分隔符号集合
List<Integer> divideList = new ArrayList<>();
//抽取我们所需要的分隔符
for (int i = 0; i < person - 1; i++) {
divideList.add(divideMark.get(i));
}
//分隔符从小到大排序
Collections.sort(divideList);
//末尾加入虚拟分隔符
divideList.add(cent);
//分钱方案
List<Integer> solution = new ArrayList<>();
//前一个分隔符
int previous = 0;
//遍历分隔符,求钱数
for (Integer divider : divideList){
//得到相邻两个分隔符之间的钱
solution.add(divider - previous);
//更新前一个分隔符
previous = divider;
}
//返回微信拼手气红包的金额分配方案
return solution;
}
/**
* 开始抢红包了
* @param args
*/
public static void main(String[] args) {
//红包金额的分(一分钱的分)
int cent = 500;
//抢红包的人数
int person = 7;
//生成10次分配方案
for (int i = 1; i <= 10; i++) {
System.out.println("分配方案" + i + ":" + moneyDistributor(cent, person));
}
}
}
如果是7个人抢5元钱,则控制台输出如下分配方案(如果是N,就代表N分钱,下同):
分配方案1:[68, 122, 110, 53, 66, 44, 37]
分配方案2:[26, 204, 50, 20, 13, 63, 124]
分配方案3:[74, 18, 27, 126, 104, 51, 100]
分配方案4:[104, 86, 124, 11, 31, 4, 140]
分配方案5:[95, 278, 26, 46, 7, 31, 17]
分配方案6:[4, 79, 230, 5, 21, 7, 154]
分配方案7:[53, 76, 291, 33, 5, 38, 4]
分配方案8:[12, 259, 12, 9, 25, 172, 11]
分配方案9:[173, 45, 35, 68, 19, 159, 1]
分配方案10:[334, 20, 7, 27, 38, 36, 38]
如果是7个人抢7分钱:
分配方案1:[1, 1, 1, 1, 1, 1, 1]
分配方案2:[1, 1, 1, 1, 1, 1, 1]
分配方案3:[1, 1, 1, 1, 1, 1, 1]
分配方案4:[1, 1, 1, 1, 1, 1, 1]
分配方案5:[1, 1, 1, 1, 1, 1, 1]
分配方案6:[1, 1, 1, 1, 1, 1, 1]
分配方案7:[1, 1, 1, 1, 1, 1, 1]
分配方案8:[1, 1, 1, 1, 1, 1, 1]
分配方案9:[1, 1, 1, 1, 1, 1, 1]
分配方案10:[1, 1, 1, 1, 1, 1, 1]
如果是7个人抢8分钱:
分配方案1:[2, 1, 1, 1, 1, 1, 1]
分配方案2:[1, 1, 1, 1, 1, 2, 1]
分配方案3:[1, 1, 1, 1, 1, 1, 2]
分配方案4:[1, 1, 1, 1, 2, 1, 1]
分配方案5:[1, 1, 2, 1, 1, 1, 1]
分配方案6:[1, 1, 1, 1, 2, 1, 1]
分配方案7:[1, 1, 1, 1, 2, 1, 1]
分配方案8:[2, 1, 1, 1, 1, 1, 1]
分配方案9:[1, 1, 1, 1, 2, 1, 1]
分配方案10:[1, 1, 1, 1, 1, 1, 2]
如果是7个人抢9分钱:
分配方案1:[1, 1, 1, 1, 1, 2, 2]
分配方案2:[1, 1, 1, 1, 3, 1, 1]
分配方案3:[1, 1, 3, 1, 1, 1, 1]
分配方案4:[1, 1, 2, 1, 1, 2, 1]
分配方案5:[2, 1, 1, 1, 2, 1, 1]
分配方案6:[1, 2, 1, 1, 1, 1, 2]
分配方案7:[2, 1, 1, 1, 1, 2, 1]
分配方案8:[2, 1, 2, 1, 1, 1, 1]
分配方案9:[1, 2, 2, 1, 1, 1, 1]
分配方案10:[2, 2, 1, 1, 1, 1, 1]