(游戏中一个很常见的简单功能,比如抽卡抽奖抽道具,或者一个怪物有多种攻击动作,按不同的权重随机出个攻击动作等等……)
假如有三种物品 A、B、C,对应的权重分别是A(50),B(20),C(30)
那么,如果从 0-100中抽取一个随机数,可以这样理解:
- 在0-50之间时,将得到A
- 在50-70之间时,得到B
- 在70-100之间时,得到C
下面是实现代码。
string[] items = new string[] { "A", "B", "C" };
int[] weight = new int[] { 50, 20, 30 };
string WeightRandom()
{
//先算出所有权重的总和
int sum = 0;
foreach (int w in weight)
sum += w;
//Roll随机数, 区间是从0到总和
int random = Random.Range(0, sum);
int currRange = 0;
//遍历每个item对应到区间。如果结果在此区间内,返回此item。
for (int i = 0; i < items.Length; i++)
{
currRange += weight[i];
if (random < currRange)
{
Debug.Log(string.Format("随机数:【{0}】. 结果:【{1}】", random.ToString(), items[i]));
return items[i];
}
}
return null;
}
测试一下:运行20次
当然,这里使用的权重50+20+30 =100 ,只是为了方便理解。
并非权重的总和一定要等于100。多少都是可以的。随机数的选取范围只需要是(0,总和)即可。