我的 .NET 项目中有一个要求,我需要从集合中选择一个项目,每个项目都有一个分配给它的权重(1 到 10 之间的整数)。
我需要一个随机生成器来考虑这个权重,即权重越高,选择对象的机会就越大。
快速复制/粘贴 C# 代码,以防有人偶然发现这一点。
class RandomWeightedSelector<T>
{
private List<T> items = new List<T>();
public void Add(T item, uint weight = 1)
{
for (int i = 0; i < weight; i++)
items.Add(item);
}
public T GetRandom()
{
return items[new Random().Next(0, items.Count)];
}
}
这是一种不需要将项目多次添加到列表中的算法。它还可以使用非整数权重,但如果您使用 System.Random 中的 NextDouble,则必须缩放所有权重以使其总和达到 1,或者将 NextDouble 中的值与 S 相乘以将其输入所需的范围。
给定一个包含项目 (I,W) 的列表 L,其中 I 是项目,W 是权重:
- 将所有重量加在一起。将此总和称为 S。
- 生成 0 到 S 之间的随机数(不包括 S,但包括 0)。将此值称为 R。
- 将变量初始化为 0 以跟踪运行总计。我们称之为 T。
- For each item (I,W) in L:
- T=T+W
- 如果 T > R,则返回 I。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)