随机红包的算法及所有随机数等于发出的红包总金额

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/danruoshui315/article/details/81567867

转载自: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

猜你喜欢

转载自blog.csdn.net/danruoshui315/article/details/81567867