需求场景:
- 在活动开发中将50000个金币分为1000个金币红包,每个红包数额在8~188之间。
缺点:
- 在实际循环测试中,很难达到最大值。因为分配过多之后会随机减少。
实现代码:
/**
* 将整数拆分为几组不同得数
* @param sum 被拆数
* @param count 拆分几组
* @param minNum 每组最小值
* @param maxNum 每组最大值
* @return
*/
private Integer[] randomAlloter(int sum, int count,int minNum,int maxNum){
//Random random = new Random();
int useNum = 0;//使用的数量
List<Integer> list = new ArrayList<Integer>();
//随机生成count个
for (int i = 0; i < count; i++) {
int round = (int)Math.round(Math.random()*(maxNum-minNum)+minNum);
//int round = random.nextInt(rightNum-leftNum+1)+leftNum;
useNum+=round;
list.add(round);
}
int random =0;
int item=0;
if(useNum>sum){
while(useNum != sum){
random = (int)(Math.random()*count);
item = list.get(random);
if(item-1<minNum){
continue;
}
if(useNum<=sum){
break;
}
useNum--;
list.set(random, item-1);
}
}
if(useNum<sum){
while(useNum != sum){
random = (int)(Math.random()*count);
item = list.get(random);
if(item+1>maxNum){
continue;
}
if(useNum>=sum){
break;
}
useNum++;
list.set(random, item+1);
}
}
Integer[] ints = new Integer[list.size()];
list.toArray(ints);
return ints;
}
调用代码
@Test
public void testApp() {
Integer[] list = randomAlloter(30, 10, 0, 8);
int a = 0;
for (Integer integer : list) {
a+=integer;
}
System.out.println(Arrays.asList(list));
System.out.println(a);
}