代码之家  ›  专栏  ›  技术社区  ›  Tomislav Markovski

我需要一个随机算法,在.net中使用加权选项

  •  5
  • Tomislav Markovski  · 技术社区  · 14 年前

    我在.NET项目中有一个要求,需要从集合中选择一个项,每个项都有一个权重(从1到10的整数)。

    我需要一个随机发生器,将考虑到这个重量,即,越高的重量,越有可能被选中的对象。

        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 回复  |  直到 6 年前
        1
  •  8
  •   Michael Madsen    14 年前

    这里有一个算法,它不需要在列表中多次添加项。它也可以用于非整数权重,不过如果使用的是System.Random中的NextDouble,则必须缩放所有权重,使之相加为1,或者将NextDouble中的值与S相乘,以使其在所需范围内。

    1. 将变量初始化为0以跟踪正在运行的总数。我们称之为T。
      1. 如果T>R、 返回I。
        2
  •  4
  •   Forrest Voight    14 年前

    列一张单子,把每一项按重量插入几次。然后从列表中随机选择一项。

        3
  •  1
  •   Brian MacKay    10 年前