将 100 平均除以动态变量

  • 本文关键字:动态 变量 c#
  • 更新时间 :
  • 英文 :


我正在为员工分配一个随机整数百分比 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% 确定此解决方案保证相同的概率(尤其是最后一个员工的情况(

最新更新