欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

将一个数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+"");
	}
}