2014-02-08 40 views
4

我基本上有一個在遊戲中填充區域的腳本,您可以添加多個對象來填充區域,並且它們都有一個從0.00到1.00的重生機會值。轉換多個百分比以適應100%

我試圖將這些產卵機會轉換爲適合100%,以便1.00與1.00的3個對象將轉換爲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. 薩姆的權重(機率)
  2. 除以1由總和
  3. 乘各權重由2
獲得的值

這會給你標準化權重,其中標準化我們ights將是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