按员工数权重将指定数量资源随机分配为整数到列表的实现方法
资源加权整数分配方案
原有方案的问题
- 你之前用
numpy.random.choice的错误是采样次数等于企业数量,自然无法匹配固定的总分配量 - 直接按比例乘完取整的问题是所有主体的小数部分都被丢弃,总分配量会比目标值少很多
下面提供两种可直接落地的实现方案:
方案1:最大余数法(确定性分配,总和严格等于目标值)
这是公共资源分配领域的标准算法,分配结果完全按权重比例确定,无随机波动,总和100%等于bev_calc:
import numpy as np # 输入参数 employees_summed = # 你的企业员工数量列表 bev_calc = 2000 total_employee = sum(employees_summed) # 计算基础分配整数部分和余数 base_allocation = np.floor([e * bev_calc / total_employee for e in employees_summed]).astype(int) remainder_list = [e * bev_calc / total_employee - base for e, base in zip(employees_summed, base_allocation)] # 剩余未分配的额度,按余数从大到小依次分配1个,直到额度用完 remaining_quota = bev_calc - base_allocation.sum() top_remainder_index = np.argsort(remainder_list)[::-1][:remaining_quota] base_allocation[top_remainder_index] += 1 bev_company = base_allocation.tolist()
方案2:加权随机分配法(带随机性,总和严格等于目标值)
如果你需要分配结果有随机波动,同时保证总和完全匹配目标值,可以采用加权采样计数的思路:把bev_calc个资源逐个分配,每次分配时选中企业的概率和它的员工数权重成正比,统计每个企业的被选中次数就是最终分配量:
import numpy as np # 输入参数 employees_summed = # 你的企业员工数量列表 bev_calc = 2000 total_employee = sum(employees_summed) weight_list = [e / total_employee for e in employees_summed] # 采样bev_calc次,统计每个企业的命中次数 sample_result = np.random.choice(len(employees_summed), size=bev_calc, p=weight_list) bev_company = np.bincount(sample_result, minlength=len(employees_summed)).tolist()
该方案每次运行结果都会有差异,但概率分布完全符合员工数权重,员工数多的企业分配到更多资源的概率更高,员工数少的企业也有概率分到资源,不会出现大量0的情况。
内容的提问来源于stack exchange,提问作者Nikola Cigoj
相关产品推荐
相关产品推荐

