转载自:https://blog.csdn.net/i_chenjiahui/article/details/54947198
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;
public class Test {
/**
*
* @param total
* 总金额
* @param splitCount
* 个数
* @param min
* 最小金额
* @param max
* 最大金额
*/
public static void splitRedPacket(int total, int splitCount, int min, int max) {
System.out.println("总金额: " + total);
System.out.println("个数: " + splitCount);
System.out.println("最小金额: " + min);
System.out.println("最大金额: " + max);
ArrayList<Integer> al = new ArrayList<Integer>();
Random random = new Random();
if ((splitCount & 1) == 1) {// 奇数个红包,需要单独将其中一个红包先生成,以保证后续算法拆分份
System.out.println("红包个数" + splitCount + "是奇数,单独生成一个红包");
int num = 0;
do {
num = random.nextInt(max);
// num = (total - num) % (splitCount / 2) + num; //
// 将后面算法拆分时的余数加入到这个随机值中
System.out.println("单个的随机红包为:" + num);
} while (num >= max || num <= min);
total = 40000 - num;
al.add(num);
}
int couples = splitCount >> 1;
System.out.println(Integer.toBinaryString(splitCount));
System.out.println(Integer.toBinaryString(couples));
System.out.println("====拆分的数量是====="+couples);
int perCoupleSum = total / couples;
if ((splitCount & 1) == 1) {
System.out.println("处理后剩余的金额为:" + total);
}
System.out.println("将" + total + "元拆分为" + couples + "对金额,每对总额:" + perCoupleSum);
for (int i = 0; i < couples; i++) {
Boolean finish = true;
int num1 = 0;
int num2 = 0;
do {
num1 = random.nextInt(max);
num2 = perCoupleSum - num1;
System.out.println("***num1***"+num1);
System.out.println("num2: "+num2);
if (!al.contains(num1) && !al.contains(num2)) {
if (i == 0) {
num1 = (total - couples * perCoupleSum) + num1;
System.out.println("***num1***"+num1);
System.out.println("***num2: "+num2);
}
}
} while (num1 < min || num1 > max || num2 < min || num2 > max);
al.add(num1);
al.add(num2);
System.out.println("num1: "+num1+" num2: "+num2);
System.out.println("-----------al:"+al);
}
int check_num = 0;
//Integer.compare(1, 2);
al.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
});
System.out.println(Arrays.toString(al.toArray()));
/*for (int x : al) {
check_num = check_num + x;
}*/
for(int i = 0; i < al.size();i++) {
check_num = check_num + al.get(i);
}
System.out.println("al的长度是:"+al.size());
System.out.println("验证总和:" + check_num);
}
public static void main(String[] args) {
//splitRedPacket(40000, 41, 300, 1500);
System.out.println("*****************");
splitRedPacket(20000, 30, 300, 1000);
}
}
输出:
*****************
总金额: 20000
个数: 30
最小金额: 300
最大金额: 1000
11110
1111
====拆分的数量是=====15
将20000元拆分为15对金额,每对总额:1333
***num1***96
num2: 1237
***num1***101
***num2: 1237
***num1***537
num2: 796
***num1***542
***num2: 796
num1: 542 num2: 796
-----------al:[542, 796]
***num1***124
num2: 1209
***num1***599
num2: 734
num1: 599 num2: 734
-----------al:[542, 796, 599, 734]
***num1***301
num2: 1032
***num1***207
num2: 1126
***num1***392
num2: 941
num1: 392 num2: 941
-----------al:[542, 796, 599, 734, 392, 941]
***num1***235
num2: 1098
***num1***857
num2: 476
num1: 857 num2: 476
-----------al:[542, 796, 599, 734, 392, 941, 857, 476]
***num1***534
num2: 799
num1: 534 num2: 799
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799]
***num1***601
num2: 732
num1: 601 num2: 732
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732]
***num1***23
num2: 1310
***num1***482
num2: 851
num1: 482 num2: 851
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851]
***num1***687
num2: 646
num1: 687 num2: 646
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646]
***num1***59
num2: 1274
***num1***120
num2: 1213
***num1***909
num2: 424
num1: 909 num2: 424
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646, 909, 424]
***num1***69
num2: 1264
***num1***525
num2: 808
num1: 525 num2: 808
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646, 909, 424, 525, 808]
***num1***399
num2: 934
num1: 399 num2: 934
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646, 909, 424, 525, 808, 399, 934]
***num1***456
num2: 877
num1: 456 num2: 877
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646, 909, 424, 525, 808, 399, 934, 456, 877]
***num1***441
num2: 892
num1: 441 num2: 892
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646, 909, 424, 525, 808, 399, 934, 456, 877, 441, 892]
***num1***370
num2: 963
num1: 370 num2: 963
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646, 909, 424, 525, 808, 399, 934, 456, 877, 441, 892, 370, 963]
***num1***244
num2: 1089
***num1***554
num2: 779
num1: 554 num2: 779
-----------al:[542, 796, 599, 734, 392, 941, 857, 476, 534, 799, 601, 732, 482, 851, 687, 646, 909, 424, 525, 808, 399, 934, 456, 877, 441, 892, 370, 963, 554, 779]
[370, 392, 399, 424, 441, 456, 476, 482, 525, 534, 542, 554, 599, 601, 646, 687, 732, 734, 779, 796, 799, 808, 851, 857, 877, 892, 909, 934, 941, 963]
al的长度是:30
验证总和:20000