我基本上有一个脚本填充游戏中的某个区域,你可以添加多个对象来填充该区域,它们都有一个附加的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();
}
任何人都知道如何解决这个问题,或者更好的解决方案。
答案 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.
这是一个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