我需要在.net中使用称重选项的随机算法

我的.net项目中有一个要求,我需要从集合中选择一个项目,每个项目都有一个权重(整数从1到10)分配给它。 我需要一个随机生成器来考虑这个权重,即权重越高,选择对象的机会就越多。 虽然算法描述也很好,但是.net中的任何代码示例都很受欢迎。

编辑:快速复制/粘贴C#代码,以防有人偶然发现。

class RandomWeightedSelector { private List items = new List(); 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以获得它期望的范围。

给出项目列表L(I,W),其中I是项目,W是权重:

  1. 将所有权重加在一起。 叫这笔钱S.
  2. 生成0到S之间的随机数(不包括S,但包括0)。 调用此值R.
  3. 将变量初始化为0以跟踪运行总计。 我们称之为T.
  4. 对于L中的每个项目(I,W):
    1. T = + W
    2. 如果T> R,则返回I.

制作一个列表并以重量次数插入每个项目。 然后从列表中选择一个随机项。

您正在寻找的是称为加权选择器算法。 我实际上在不久前创建了一个开源C#项目!

它非常易于使用且高效。 此外,文档应该让你没有问题。

以下是一些链接:

  • Github上的加权选择器
  • 加权选择器nuGet包