/// <summary>
        /// Initializes a new instance of the <see cref="DiceModifier"/> class.
        /// </summary>
        /// <param name="die">The die being modified.</param>
        /// <param name="modifierValue">The value of the modification.</param>
        /// <param name="rng">The random number generator.</param>
        public DiceModifier(IAbstractDie die, int modifierValue, IRandomNumberGenerator rng)
            : base(rng)
        {
            Debug.Assert(die != null, "The die cannot be null.");

            this.die = die;
            Modifier = modifierValue;
            ProbabilityDistribution = CreateProbabilityDistribution(die, modifierValue);
        }
        private double CreateProbabilityDistribution(IAbstractDie die, ComparisonType comparisonType, int referenceValue)
        {
            Func <int, bool> comparitor = GetComparitor(comparisonType, referenceValue);
            double           result     = die.ProbabilityDistribution.Specification
                                          .Where(p => comparitor(p.Value))
                                          .Sum(p => p.Probability);

            Debug.Assert(0.0 <= result && result <= 1.0, "The probability should be in range [0.0, 1.0].");

            return(result);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ThresholdCompare"/> class.
        /// </summary>
        /// <param name="die">The die whose result should be compared.</param>
        /// <param name="comparisonType">How the result of <paramref name="die"/> should be compared.</param>
        /// <param name="referenceValue">To what value <paramref name="die"/> should be compared.</param>
        /// <param name="rng">The random number generator.</param>
        public ThresholdCompare(IAbstractDie die, ComparisonType comparisonType, int referenceValue, IRandomNumberGenerator rng)
        {
            Debug.Assert(die != null, "The die cannot be null.");
            Debug.Assert(
                comparisonType == ComparisonType.Greater || comparisonType == ComparisonType.GreaterOrEqual ||
                comparisonType == ComparisonType.Smaller || comparisonType == ComparisonType.SmallerOrEqual,
                "The comparison type must be a known member.");
            Debug.Assert(rng != null, "The random number generator cannot be null.");

            this.die       = die;
            ComparisonType = comparisonType;
            ReferenceValue = referenceValue;
            this.rng       = rng;

            double successProbability = CreateProbabilityDistribution(die, comparisonType, referenceValue);

            ProbabilityDistribution = new BooleanProbabilityDistribution(successProbability);

            Debug.Assert(ProbabilityDistribution != null, "The property ProbabilityDistribution should be initialized.");
        }
 private DiscreteValueProbabilityDistribution CreateProbabilityDistribution(IAbstractDie die, int modifier)
 {
     return(new DiscreteValueProbabilityDistribution(die.ProbabilityDistribution.Specification
                                                     .Select(p => new ValueProbabilityPair(p.Value + modifier, p.Probability))));
 }