在List里面随机取一个值很简单,只要生成一个随机数在0到List的数量区间,然后取这个下标的值就行了。但是如果List里面的每个值都有一个取值概率,那该怎么得到呢?
/// <summary>
/// 从指定的概率池中随机挑选一个概率值,并将其索引返回
/// </summary>
/// <param name="probabilities">概率池</param>
/// <returns></returns>
public static int GetProbability(float[] probabilities) {
float total = 0f;
int count = probabilities.Length;
// 首先计算出概率的总值,用来计算随机范围
for (var i = 0; i < count; i++) {
total += probabilities[i];
}
//从0到概率的总和,随机一个float类型的随机数
float nob = Random.Range(0f, total);
//遍历集合,如果概率落在第i个元素之间,则返回
for (var i = 0; i < count; i++) {
if (nob < probabilities[i]) {
return i;
}
//不落在该概率之间,总概率则要减少当前概率
nob -= probabilities[i];
}
return 0;
}
Lua版本:
--在概率集合中取出一个值
function LuaUtil.GeProbablity(t)
totalprob = 0;
length = LuaUtil.TableCount(t)
for value in ipairs(t) do
totalprob = totalprob + value
end
result = random:float(0,totalprob)
for index, value in ipairs(t) do
if result < value then
return index
end
result = result - value
end
return length
end