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++;
                }
            }
        }