我需要随机算法和称重选项

时间:2010-06-30 21:24:19

标签: c# .net algorithm random

我的.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)];
        }
    }

3 个答案:

答案 0 :(得分:8)

这是一种算法,不需要多次将项目添加到列表中。它也可以使用非整数权重,但是如果您使用System.Random中的NextDouble,则必须将所有权重缩放到最多1,或者将NextDouble中的值乘以S以获得它期望的范围。

给出项目清单L(I,W),其中我是项目,W是权重:

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

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

以下是一些链接: