У меня есть требование в моем проекте.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)];
}
}
Вот алгоритм, который не требует многократного добавления элементов в список. Он также может работать с нецелочисленными весами, хотя, если вы используете NextDouble из System.Random, вам придется масштабировать все веса, чтобы сложить их до 1, или умножить значение из NextDouble на S, чтобы получить его. желаемый диапазон.
Дан список L элементов (I, W), где I - элемент, а W - вес:
Составьте список и вставьте каждый элемент в весе количество раз. Затем выберите случайный предмет из списка.