Мне нужен случайный алгоритм с весящими опциями

У меня есть требование в моем проекте.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)];
        }
    }
5
задан double-beep 21 May 2019 в 11:40
поделиться

2 ответа

Вот алгоритм, который не требует многократного добавления элементов в список. Он также может работать с нецелочисленными весами, хотя, если вы используете 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. T = T + W
    2. Если T> R, вернуть I.
8
ответ дан 18 December 2019 в 14:42
поделиться

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

4
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: