private T RandomlySelectOption <T>(IEnumerable <T> options) where T : IWeighted { var opts = options.ToArray(); var totalWeights = opts.Sum(o => o.Weight); var selectedNumber = _randomNumber.Number(totalWeights); var currrentWeight = 0; foreach (var t in opts) { currrentWeight += t.Weight; if (currrentWeight > selectedNumber) { return(t); } } return(opts.Last()); }