将一个数M随机分为N份,并限制每份的大小
程序员文章站
2022-07-10 20:23:02
...
将一个数M随机分为N份,并限制每份的大小
需求场景:
-在活动开发中将50000个金币分为1000个金币红包,每个红包数额在8~188之间。
缺点:
在实际循环测试中,很难达到最大值。因为分配过多之后会随机减少。
实现代码:
public List<Integer> randomAlloter(int totalNum, int count,int leftNum,int rightNum){
//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()*(rightNum-leftNum)+leftNum);
//int round = random.nextInt(rightNum-leftNum+1)+leftNum;
useNum+=round;
list.add(round);
}
int random =0;
int item=0;
if(useNum>totalNum){
while(useNum != totalNum){
random = (int)(Math.random()*count);
item = list.get(random);
if(item-1<leftNum){
continue;
}
if(useNum<=totalNum){
break;
}
useNum--;
list.set(random, item-1);
}
}
if(useNum<totalNum){
while(useNum != totalNum){
random = (int)(Math.random()*count);
item = list.get(random);
if(item+1>rightNum){
continue;
}
if(useNum>=totalNum){
break;
}
useNum++;
list.set(random, item+1);
}
}
return list;
}
** 测试 :**
@Test
public void test() {
List<Integer> list = ccc(50000, 1000, 8, 188);
int a = 0;
for (Integer integer : list) {
if(integer>188||integer<8){
System.out.println("sss:"+integer);
}
if(integer==188){
System.out.println("bbb:"+integer);
}
a+=integer;
set.add(integer+"");
}
}
上一篇: DNF装备强化的算法分析与实现
下一篇: List集合自定义排序
推荐阅读