IEnumerable ISelectionStrategy.Select(ISelectableItemCollection items, int count) { Contract.Requires(items != null); Contract.Requires(count > 0); Contract.Ensures(Contract.Result<IEnumerable>() != null); return null; }
public IEnumerable Select(ISelectableItemCollection orderedItems, int count) { var returned = new HashSet<int>(); int itemCount = orderedItems.Count; while (returned.Count != count) { int index = RandomGenerator.Random.Next(itemCount); if (!returned.Contains(index)) { var item = orderedItems.Select(index); yield return item; returned.Add(index); } } }
public System.Collections.IEnumerable Select(ISelectableItemCollection orderedItems, int count) { int itemCount = orderedItems.Count; int tournamentSize = TournamentSize; if (tournamentSize < count) tournamentSize = count; if (tournamentSize > itemCount) tournamentSize = itemCount; var arena = new SortedDictionary<int, object>(); while (arena.Count != tournamentSize) { int index = RandomGenerator.Random.Next(itemCount); if (!arena.ContainsKey(index)) arena.Add(index, orderedItems.Select(index)); } var baseProbability = BestWinChance; var p = baseProbability; int returnedCount = 0; while (returnedCount != count) { int index = 0; int winnerIndex = -1; object winner = null; foreach (var kvp in arena) { if (p) { winnerIndex = kvp.Key; winner = kvp.Value; break; } p = (double)baseProbability * Math.Pow((1.0 - (double)baseProbability), index++); } if (winnerIndex != -1) { yield return winner; arena.Remove(winnerIndex); returnedCount++; } } }