Ejemplo n.º 1
0
        public void TakeRandom_IEnumerable_Uniformity(int trialsQty, int toSelectQty, int elementsQty, int inRangeQty)
        {
            // Arrange
            int expectedCount  = trialsQty / (elementsQty / toSelectQty);
            var timesChosen    = new int[elementsQty];
            var randomSelector = new RandomSelector();

            // Act
            for (var trial = 0; trial < trialsQty; trial++)
            {
                foreach (var selected in randomSelector.TakeRandom(Range(0, elementsQty), toSelectQty, timesChosen.Length))
                {
                    timesChosen[selected]++;
                }
            }

            var avg = timesChosen.Average();
            var max = timesChosen.Max();
            var min = timesChosen.Min();
            var allowedDifference = expectedCount / elementsQty;
            var countInRange      = timesChosen.Count(i => i >= expectedCount - allowedDifference && i <= expectedCount + allowedDifference);

            // Assert
            AssertBetween(avg, expectedCount - 2, expectedCount + 2, "Average");
            Assert.True(countInRange >= inRangeQty, string.Format("Not enough were in range: {0}", countInRange));
        }