2014-02-08 4 views
4

У меня в основном есть скрипт, который заполняет область в игре. Вы можете добавить несколько объектов, чтобы заполнить область, и все они имеют значение появления нерестится от 0.00 - 1.00.Преобразование нескольких процентов для вставки в 100%

Я пытаюсь преобразовать эти шансы появления, чтобы вписаться в 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(); 
} 

Каждый знает, как идти об этом, или то, что может быть лучшим решением.

+2

Почему 3 объектов с 100% конвертировать в одно и то же, как 3-х объектов с 50% ? – nhgrif

+0

Потому что они должны конвертировать так, чтобы все, что было добавлено вместе, равны 100% (возможно, я думаю об этом неправильно) –

+0

Итак, «Шанс стоимости» - это вес? Объект с 0,5 должен появляться вдвое чаще, чем объект с 0,25? Но независимо от того, какая сумма весов, сумма процентов всегда должна составлять 100%. – nhgrif

ответ

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

Ах, спасибо, всегда старайтесь и идите в неправильном направлении с этими вещами. –

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; 
1

Вы должны следовать этому подходу:

  1. Sum веса (шансы)
  2. Разделите 1 на сумму
  3. Multiply вес каждой величиной, полученной в 2

Это даст вам нормализованный вес, где сумма нормированных нами ч и будет 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 
Смежные вопросы