Такое решение сработает (будет соблюдена вероятность) только в том случае когда таблица будет полностью пуста (все экшены уменьшат свое значения до 0 и не будут возвращены в таблицу). А если нужно взять значение с нужной вероятность всего 1 раз, то это будет по сути обычный рандом.
А, так тебе вон чего нужно
, тогда так:
1. Считаем сумму всех действий. Затем рандомно выбираем из этой суммы число (что можно сопоставить со случайной строчкой из списка в твоём примере).
2. Из всех чисел повторов действий определяем наибольшее, потому что у него максимальная вероятность перекрыть диапазон, в которое попадёт число, полученное в п.1. Сравниваем число из п.1 с нашим наибольшим. Если число из п.1 меньше нашего наибольшего, это будет означать, что вероятность уже сработала, и мы выполняем действие, соответствующее этому числу повторов. Затем вычитаем из большего числа повторов 1 и возвращаем в массив данных.
--------------------------------------------------------------------------------------------------------------------------
Пояснение:
Например у нас для простоты всего 2 числа: 90 и 10. Сумма будет 100. Рандомно генерим число от 0 до 100. Вероятность получения числа больше 90 - 10% из 100%. Т.е. у нас прямое соответствие между числами и их процентным отношением в общей сумме. При таком подходе мы чётко попадаем в заданную вероятность, исходя из числа заданных нами повторов.
Если у нас большее кол-во чисел, то соотношение тоже соблюдается. В примере использую 100 для простоты сопоставления. Всё это же будет соблюдаться при любых значениях чисел. Например: 48, 92, 589 и т.д. Сумма - 729. Каждое отдельное число будет занимать процент от суммы, который напрямую соотносится с его значением.
-------------------------------------------------------------------------------------------------------------------------
В случае, если рандомное число не меньше нашего большего мы переходим к следующему этапу - вычитаем из общей суммы повторов действий большее число, затем генерим от 0 до полученного и опять сравниваем его с наибольшим из оставшихся. И так до бесконечности - пока не закончатся все числа и станется одно последнее, которое не с чем будет сравнивать.
Также придётся обработать вариант, когда несколько чисел в массиве повторов будут одинаковыми.
Всё это делать в цикле до тех пор пока все числа повторов не превратятся в нули за счёт вычитание по 1 из одного из них при каждом повторе общей петли цикла.
P.S. Получение большего из нескольких чисел можно тут посмотреть попробовать:
http://www.cyberforum.ru/csharp-beginners/thread1381018.html
-