java中将整数随机拆分

今天有一个业务场景,讲的是现在有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值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值