public void PickItem_RandomSelectionReflectsDefinedProbability()
        {
            const string NotExpected           = "First Item";
            const string SometimesExpectedItem = "Second Item";
            const string MostlyExpected        = "Third Item";

            RandomAssignmentExperiment <string> target = new RandomAssignmentExperiment <string>();

            target.Add(new RandomAssignmentExperimentItem <string>(NotExpected)
            {
                OddsNumerator = 0 // 0 chance
            });
            target.Add(new RandomAssignmentExperimentItem <string>(SometimesExpectedItem)
            {
                OddsNumerator = 2 // 2/5 chance, or 40%
            });
            target.Add(new RandomAssignmentExperimentItem <string>(MostlyExpected)
            {
                OddsNumerator = 3 // 3/5 chance, or 60%
            });

            const int PickCount = 10000;

            List <string> actuals = new List <string>(PickCount);

            // TODO: Use Parallel.For when we upgrade to .NET 4.0.
            for (int i = 0; i < PickCount; i++)
            {
                string actual = target.PickItem();
                actuals.Add(actual);
                Assert.AreNotEqual(actual, NotExpected);
            }

            Assert.AreEqual(PickCount, actuals.Count);

            int sometimesExpectedItemCount = actuals.Count(item => item.Equals(SometimesExpectedItem));
            int mostlyExpectedItemCount    = actuals.Count(item => item.Equals(MostlyExpected));

            Assert.AreEqual(PickCount, sometimesExpectedItemCount + mostlyExpectedItemCount);

            Assert.IsTrue(
                sometimesExpectedItemCount < mostlyExpectedItemCount,
                string.Format("Sometimes: {0}. Mostly: {1}", sometimesExpectedItemCount, mostlyExpectedItemCount));

            //// Verify split was within 50 picks, or 5% of a "perfect" outcome (400:600)

            Assert.IsTrue(sometimesExpectedItemCount >= 3750, "Anomalous result (sometimesExpectedItemCount): " + sometimesExpectedItemCount);
            Assert.IsTrue(sometimesExpectedItemCount <= 4250, "Anomalous result (sometimesExpectedItemCount): " + sometimesExpectedItemCount);

            Assert.IsTrue(mostlyExpectedItemCount >= 5750, "Anomalous result (mostlyExpectedItemCount): " + mostlyExpectedItemCount);
            Assert.IsTrue(mostlyExpectedItemCount <= 6250, "Anomalous result (mostlyExpectedItemCount): " + mostlyExpectedItemCount);
        }
 public void OddsDenominator_IsSumOfNumerators()
 {
     RandomAssignmentExperiment<string> target = new RandomAssignmentExperiment<string>();
     target.Add(new RandomAssignmentExperimentItem<string>("First Item")
     {
         OddsNumerator = 0
     });
     target.Add(new RandomAssignmentExperimentItem<string>("Second Item")
     {
         OddsNumerator = 1
     });
     target.Add(new RandomAssignmentExperimentItem<string>("Third Item")
     {
         OddsNumerator = 2
     });
     int actual = target.OddsDenominator;
     Assert.AreEqual(actual, 3);
 }
        public void OddsDenominator_IsSumOfNumerators()
        {
            RandomAssignmentExperiment <string> target = new RandomAssignmentExperiment <string>();

            target.Add(new RandomAssignmentExperimentItem <string>("First Item")
            {
                OddsNumerator = 0
            });
            target.Add(new RandomAssignmentExperimentItem <string>("Second Item")
            {
                OddsNumerator = 1
            });
            target.Add(new RandomAssignmentExperimentItem <string>("Third Item")
            {
                OddsNumerator = 2
            });
            int actual = target.OddsDenominator;

            Assert.AreEqual(actual, 3);
        }
        public void OddsNumerator_IsAlwaysSelectedWhenProbabilityIs100Percent()
        {
            string expected = "Second Item";
            RandomAssignmentExperiment<string> target = new RandomAssignmentExperiment<string>();
            target.Add(new RandomAssignmentExperimentItem<string>("First Item")
            {
                OddsNumerator = 0
            });
            target.Add(new RandomAssignmentExperimentItem<string>(expected)
            {
                OddsNumerator = 1
            });
            target.Add(new RandomAssignmentExperimentItem<string>("Third Item")
            {
                OddsNumerator = 0
            });

            for (int i = 0; i < 100; i++)
            {
                string actual = target.PickItem();
                Assert.AreEqual(actual, expected);
            }
        }
        public void OddsNumerator_IsAlwaysSelectedWhenProbabilityIs100Percent()
        {
            string expected = "Second Item";
            RandomAssignmentExperiment <string> target = new RandomAssignmentExperiment <string>();

            target.Add(new RandomAssignmentExperimentItem <string>("First Item")
            {
                OddsNumerator = 0
            });
            target.Add(new RandomAssignmentExperimentItem <string>(expected)
            {
                OddsNumerator = 1
            });
            target.Add(new RandomAssignmentExperimentItem <string>("Third Item")
            {
                OddsNumerator = 0
            });

            for (int i = 0; i < 100; i++)
            {
                string actual = target.PickItem();
                Assert.AreEqual(actual, expected);
            }
        }
        public void PickItem_RandomSelectionReflectsDefinedProbability()
        {
            const string NotExpected = "First Item";
            const string SometimesExpectedItem = "Second Item";
            const string MostlyExpected = "Third Item";

            RandomAssignmentExperiment<string> target = new RandomAssignmentExperiment<string>();
            target.Add(new RandomAssignmentExperimentItem<string>(NotExpected)
            {
                OddsNumerator = 0 // 0 chance
            });
            target.Add(new RandomAssignmentExperimentItem<string>(SometimesExpectedItem)
            {
                OddsNumerator = 2 // 2/5 chance, or 40%
            });
            target.Add(new RandomAssignmentExperimentItem<string>(MostlyExpected)
            {
                OddsNumerator = 3 // 3/5 chance, or 60%
            });

            const int PickCount = 10000;

            List<string> actuals = new List<string>(PickCount);

            // TODO: Use Parallel.For when we upgrade to .NET 4.0.
            for (int i = 0; i < PickCount; i++)
            {
                string actual = target.PickItem();
                actuals.Add(actual);
                Assert.AreNotEqual(actual, NotExpected);
            }

            Assert.AreEqual(PickCount, actuals.Count);

            int sometimesExpectedItemCount = actuals.Count(item => item.Equals(SometimesExpectedItem));
            int mostlyExpectedItemCount = actuals.Count(item => item.Equals(MostlyExpected));

            Assert.AreEqual(PickCount, sometimesExpectedItemCount + mostlyExpectedItemCount);

            Assert.IsTrue(
                sometimesExpectedItemCount < mostlyExpectedItemCount,
                string.Format("Sometimes: {0}. Mostly: {1}", sometimesExpectedItemCount, mostlyExpectedItemCount));

            //// Verify split was within 50 picks, or 5% of a "perfect" outcome (400:600)

            Assert.IsTrue(sometimesExpectedItemCount >= 3750, "Anomalous result (sometimesExpectedItemCount): " + sometimesExpectedItemCount);
            Assert.IsTrue(sometimesExpectedItemCount <= 4250, "Anomalous result (sometimesExpectedItemCount): " + sometimesExpectedItemCount);

            Assert.IsTrue(mostlyExpectedItemCount >= 5750, "Anomalous result (mostlyExpectedItemCount): " + mostlyExpectedItemCount);
            Assert.IsTrue(mostlyExpectedItemCount <= 6250, "Anomalous result (mostlyExpectedItemCount): " + mostlyExpectedItemCount);
        }