C#根据权重抽取随机数
作者:煮粥侠_99
最近在开发过程中遇到一个需要做带权随机的处理,本文主要介绍了C#根据权重抽取随机数,具有一定的参考价值,感兴趣的可以了解一下
(游戏中一个很常见的简单功能,比如抽卡抽奖抽道具,或者一个怪物有多种攻击动作,按不同的权重随机出个攻击动作等等……)
假如有三种物品 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,总和)即可。
到此这篇关于C#根据权重抽取随机数的文章就介绍到这了,更多相关C#根据权重抽取随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!