需求分析:
在练习抢红包这个题目时,需要将金额随机拆分成若干个红包,每个红包的金额数是随机的。
例如:
- 发出100块的三个红包,一个人抢了71块,一个人抢了2块,最后一个人抢到了27块。
算法思路:
需要考虑的地方:
- 随机拆分一个整数为若干份
- 最小的值为1(不能有空红包)
将拆分的红包设为数组,数组的大小为红包个数。
用1填充数组,保证最小红包值。
随机生成红包序号,随机生成小于总金额数的数字,该数字加入该序号的红包。
循环以上过程,直到金额被分完。
代码实现:
/**
* 抢红包随机数
* @param sum 红包金额总数
* @param size 红包个数
* @return 分成的每个红包的金额数
*/
private static int[] getPocketArray(int sum,int size) {
int[] array = new int[size];
//保证最小的红包数为1
Arrays.fill(array, 1);
int s = sum - size;
Random r = new Random();
while(s > 0) {
int x = r.nextInt(size); //随机选择红包序列号
int y = r.nextInt(s); //生成随机金额数
if (s == 1){
array[x]++;
break;
}else {
array[x] += y;
}
s -= y;
}
return array;
}