用动态变量均匀地划分100

时间:2018-03-05 05:41:59

标签: c#

我正在为员工分配一个100的随机整数百分比。这个百分比是根据我们有多少员工而且总数必须达到100个。

如果我们有4名员工,如果我们有2名员工,我可能希望产生80-10-5-5之类的分组。百分比越随机越好。

我不确定如何在没有大量不同的if语句的情况下如何优雅地完成这一点,但即便如此,随机性也会受到限制。

3 个答案:

答案 0 :(得分:3)

只需为每位员工分配一定范围内的随机数(范围由您决定)。比计算随机数的总和。最后一步:将每个随机数除以总和,得出百分比。

示例:随机数3,9,7 总和= 19 百分比:3/19 = 16%,9/19 = 47%,7/19 = 37% (值是四舍五入的。)

答案 1 :(得分:0)

我为此编写了一个示例代码:

        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());
        }

如有必要,请随时改进逻辑。

答案 2 :(得分:0)

这应该有效:

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;

请注意

  • 最后一行解决了舍入问题,以防百分比&#39;总和不是100
  • 仅使用LINQ的解决方案也是可行的,尽管可读性较差且可能对性能产生影响(例如,使用Aggregate会引入匿名类型的创建)
  • 我并非100%确定此解决方案可以保证相同的概率(尤其是最后一位员工的情况)