我正在为员工分配一个随机整数百分比 100。此百分比基于我们拥有的员工数量,并且总数必须达到 100。
如果我们有 4 名员工,如果我们有 2 名员工,我可能想生成一个拆分,例如 80-10-5-5..。百分比越随机越好。
我不确定如何在没有大量不同的 if 语句的情况下优雅地完成此操作,但即便如此,我觉得随机性也是有限的。
只需为每位员工分配一个特定范围内的随机数(范围由您决定(。比计算随机数的总和。最后一步:将每个随机数除以总和,从而得出百分比。
示例:随机数 3、9、7总和 = 19百分比: 3/19=16%, 9/19=47%, 7/19=37%(值四舍五入。
我为此编写了一个示例代码:
int no_of_employees = 4;
int total_percentage = 100;
List<int> tempNumberList = new List<int>();
List<int> finalNumberList = new List<int>();
Random random = new Random();
for (int i = 0; i < no_of_employees; i++)
{
tempNumberList.Add(random.Next(total_percentage));
}
int sum = tempNumberList.Sum();
foreach(int number in tempNumberList)
{
finalNumberList.Add((number * total_percentage) / sum);
}
if(finalNumberList.Sum() != total_percentage)
{
finalNumberList[0] = finalNumberList[0] + (total_percentage - finalNumberList.Sum());
}
如有必要,请随时改进逻辑。
这应该有效:
var random = new Random();
var percentages = new List<int>();
int remainder = 100;
for (int i = 0; i < employeesCount; i++)
{
int percentage = random.Next(remainder);
percentages.Add(percentage);
remainder -= percentage;
}
percentages[percentages.Count - 1] += remainder;
请注意,
- 最后一行解决了百分比总和不是 100 时的舍入问题
- 仅使用 LINQ 的解决方案也是可行的,尽管可读性较差,并且可能会影响性能(例如,使用 Aggregate 引入了匿名类型的创建(
- 我不能 100% 确定此解决方案保证相同的概率(尤其是最后一个员工的情况(