要求:实现参与抢红包人员可以抢到随机金额,每个人必须抢到大于0的金额。
思路:1.生成(总人数-1)个范围在0到总金额的随机数,组成数组arrList;
2.通过冒泡排序按照从小到大排序;
3.将排序后的数组按照arrList[i+1]-arrList[i]方式取出(总人数-1)个差值,组成一个新数组newArrList
(注意:取出的第一个数据为第一个随机数,即arrList[1]-0)
4.总金额减去第三步newArrList所有数据之和,得到差值作为newArrList最后一个元素;
5.得到一个数组newArrList;
6.接收到抽奖请求后,按顺序取newArrList中的值作为该参与者的红包金额。
思路实现图:(以6个人为例)
1.生成5个随机数升序排列
0 | 5 | 23 | 46 | 67 | 79 |
5 | 18 | 23 | 21 | 12 | 21 |
代码实现:
private static List<Integer> getMoney(Integer totalMoney,Integer totalPersons){ Random random = new Random(); int[] randomNumList = new int[totalPersons-1]; for(int i=0;i<totalPersons-1;i++){ Integer randomNum = random.nextInt(totalMoney); randomNumList[i] = randomNum; } int temp = 0; for(int i=0;i<randomNumList.length-1;i++){ for(int j=0;j<randomNumList.length-1-i;j++){ if(randomNumList[j+1]<randomNumList[j]){ temp = randomNumList[j]; randomNumList[j] = randomNumList[j+1]; randomNumList[j+1] = temp; } } } List<Integer> moneyList = new ArrayList<>(); int total = 0; for(int i=0;i<randomNumList.length;i++){ if(i==0){ moneyList.add(randomNumList[0]); total+=randomNumList[0]; }else{ int tempNum = randomNumList[i]-randomNumList[i-1]; moneyList.add(tempNum); total+=tempNum; } } moneyList.add(totalMoney-total); return moneyList; }
测试验证:
public static void main(String[] args){
List<Integer> aa = getMoney(180,6); for(int a : aa){ System.out.println("抽取红包金额为:"+a+"元"); } }
测试结果:
抽取红包金额为:12元
抽取红包金额为:32元
抽取红包金额为:43元
抽取红包金额为:44元
抽取红包金额为:22元
抽取红包金额为:27元