今天有一个业务场景,讲的是现在有300件货物要分给30个人,每个人收到的货物是随机的但是相对平均,问怎么分?
先说一下思路,因为我们不可能直接通过随机数来凑满300件货物,因此只能在货物按照随机数分配后,我们再进行调控,如果随机出来得到的货物数量不够300的话,只能将剩下的货物,平均分给每一个人,然后不够分给每一个人的货物,全部分给最后一个人,于是这样会导致最后一个人分的的货物过多(这里也可以再次用递归的方式再分配一边,这里我就没有写了)。代码如下
package cn.txj.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class TestCat {
private static List<Integer> list = new ArrayList<Integer>();
//总数
private static Integer totalCount = 300;
//随机数在0-bound之间取值
private static Integer bound = 30;
//总人数
private static Integer PeopleCount = 20;
public static void main(String[] args) {
Random random = new Random();
int nextInt = random.nextInt(bound);
Integer tempTotal = 0;
Integer temp = 0;
for(int i=0;i<PeopleCount;i++){
if(tempTotal>totalCount){
list.set(list.size()-1, list.get(list.size()-1)-(tempTotal-totalCount));
tempTotal = totalCount;
}else if(tempTotal<totalCount){
temp = random.nextInt(bound);
tempTotal = tempTotal+temp;
list.add(temp);
}else if(tempTotal==totalCount){
list.add(0);
}
}
Integer checkTotalCount = 0;
for (Integer temp1 : list) {
checkTotalCount = checkTotalCount + temp1;
System.out.println(temp1);
}
System.out.println("-----------");
if(checkTotalCount<totalCount){
Integer surplus = totalCount -checkTotalCount;
Integer floor = (int) Math.floor(surplus/PeopleCount);
for(int i=0;i<list.size();i++){
list.set(i, list.get(i)+floor);
}
list.set(list.size()-1, list.get(list.size()-1)+surplus-floor*PeopleCount);
}
checkTotalCount= 0;
for (Integer temp1 : list) {
checkTotalCount = checkTotalCount + temp1;
System.out.println(temp1);
}
System.out.println("总数为"+checkTotalCount);
}
}
没办法处理当bound边界过大导致的后面的数据全部为0的局面,因为要大概平均所以我们需要给一个合适的bound值