转换多个百分比以适应100%

时间:2014-02-08 21:09:10

标签: c# math percentage

我基本上有一个脚本填充游戏中的某个区域,你可以添加多个对象来填充该区域,它们都有一个附加的0.00 - 1.00的生成机会值。

我正在尝试将这些产生的机会转换为100%,这样3个具有1.00的对象将转换为0.33%或3个具有50%的对象也将转换为0.33%。或者最后,3个对象:0.4,0.4,0.2 - 将转换为:40,40,20(我希望是对的)。

我正在尝试,可能是在错误的方向,此刻:

void GetRanges()
{
    for (int i = 0; i < clutterObjects.Length; i++)
    {
        temp += clutterObjects[i].spawnChance;
    }

    if (temp > 1.0)
    {
        temp = temp - 1.0f;

        for (int i = 0; i < clutterObjects.Length; i++)
        {
            clutterObjects[i].spawnChance -= 
                clutterObjects[i].spawnChance * temp;
        }
    }
    else
    {
        temp = Mathf.Abs(temp - 1.0f);
        for (int i = 0; i < clutterObjects.Length; i++)
        {
            clutterObjects[i].spawnChance += 
                clutterObjects[i].spawnChance * temp;
        }
    }

    Spawn();
}

任何人都知道如何解决这个问题,或者更好的解决方案。

3 个答案:

答案 0 :(得分:3)

你只需要除以总和 - 将值归一化为总数1.从所有3的总和开始,然后将每个除以总和得到归一化概率。

double[] probabilities = { 1, 1, 1 }
double sum = probabilities.Sum();
double[] normalized = probabilities.Select(prob => prob/sum).ToArray();

或者,使用您的示例:

void GetRanges()
{
    double sum = clutteredObjects.Sum(obj => obj.spawnChance);

    for (int i = 0; i < clutterObjects.Length; i++)
    {
        clutterObjects[i].spawnChance /= sum;
    }

    Spawn();
}

答案 1 :(得分:1)

听起来你想要零件的加权平均值总计为100。

将它们全部加在一起以获得总金额,然后将它们全部乘以100并除以总数。

float temp = 0f;
for (int i = 0; i < clutterObjects.Length; i++)
    temp += clutterObject[i].spawnChance;
for (int i = 0; i < clutterObjects.Length; i++)
    clutterObjects[i].spawnChance *= 100f / temp;

答案 2 :(得分:1)

你应该遵循这种方法:

  1. 总和权重(机会)
  2. 将1除以总和
  3. 将每个重量乘以2
  4. 中获得的值

    这将为您提供规范化的权重,其中规范化权重的总和将为1.

    这是一个LINQPad程序,演示了:

    void Main()
    {
        double[] weights = { 0.5, 0.5, 0.25 };
        double sum = weights.Sum();
        double factor = 1.0 / sum;
        double[] normalizedWeights = weights.Select(w => w * factor).ToArray();
        double[] percentages = normalizedWeights.Select(w => 100.0 * w).ToArray();
        percentages.Dump();
        percentages.Sum().Dump();
    }
    

    输出:

    40
    40
    20
    
    100