/// <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)))); }