Мне нужен случайный алгоритм с параметрами взвешивания - PullRequest
5 голосов
/ 01 июля 2010

У меня есть требование в моем проекте .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 ]

8 голосов
/ 01 июля 2010

Вот алгоритм, который не требует добавления элементов несколько раз в список. Он также может работать с нецелыми весами, хотя если вы используете NextDouble из System.Random, вам придется масштабировать все веса, чтобы добавить до 1, или умножить значение из NextDouble на S, чтобы получить его в желаемый диапазон.

Дан список L предметов (I, W), где I - предмет, а W - вес:

  1. Сложите все веса вместе. Назовите эту сумму S.
  2. Генерирует случайное число от 0 до S (исключая S, но включая 0). Назовите это значение R.
  3. Инициализируйте переменную равной 0, чтобы отслеживать текущую сумму. Мы назовем это T.
  4. Для каждого элемента (I, W) в L:
    1. Т = Т + W
    2. Если T> R, вернуть I.
4 голосов
/ 01 июля 2010

Составьте список и вставьте каждый элемент в Вес количество раз.Затем выберите случайный предмет из списка.

1 голос
/ 25 ноября 2014

То, что вы ищете, называется алгоритмом взвешенного селектора.Я на самом деле создал проект C # с открытым исходным кодом для этого некоторое время назад!

Он очень прост в использовании и эффективен.Также документация должна помочь вам без проблем.

Вот несколько ссылок:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...