это не так уж сложно.У меня нет кода для работы, поэтому я предполагаю, что у вас есть объекты Move
с атрибутом Weight
внутри массива, и все веса составляют до 100,0 (на самом деле не имеет значения).Теперь вы сортируете массив по убыванию весов, выбираете случайное число от 0 до 99 и повторяете все это, уменьшая ваше случайное число.Как только он перестает быть положительным, вы останавливаетесь и выбираете текущий индекс / ход
var value = rnd.NextDouble()*100.0;
foreach(var move in moves.OrderByDescending(m => m.Weight))
{
value -= move.Weight;
if (value <= 0) return move;
}
, конечно, вы можете кэшировать порядок или даже выборки в большой массив и использовать случайный индекс для этого (дляНадеюсь, что принцип должен быть ясен.
Как предложил Джордж - вот вариант, в котором можно опустить предположения, что весовые коэффициенты составляют до 100:
double _weightSum;
...
// initialize the Sum somewhere
_weightSum = moves.SumBy(m => m.Weight);
Move GetRandomMove()
{
var value = rnd.NextDouble()*weightSum;
foreach(var move in moves.OrderByDescending(m => m.Weight))
{
value -= move.Weight;
if (value <= 0) return move;
}
}