/// <summary> /// Standard /// </summary> /// <param name="origin">Original Distribution</param> /// <param name="leftBorder">Left Border</param> /// <param name="rightBorder">Right Border</param> public BaseTrimmedContinuousDistribution(IContinuousProbabilityDistribution origin, double leftBorder, double rightBorder) { Origin = origin ?? throw new ArgumentNullException(nameof(origin)); if (leftBorder <= rightBorder) { LeftBorder = leftBorder; RightBorder = rightBorder; } else { throw new ArgumentOutOfRangeException(nameof(leftBorder), "Empty region"); } m_CdfRight = Origin.Cdf(RightBorder); m_CdfLeft = Origin.Cdf(LeftBorder); if (m_CdfRight <= 0) { throw new ArgumentOutOfRangeException(nameof(rightBorder), "Zero density region"); } if (leftBorder != rightBorder && (m_CdfRight - m_CdfLeft <= 0)) { throw new ArgumentOutOfRangeException(nameof(rightBorder), "Zero density region"); } }
/// <summary> /// Standard /// </summary> /// <param name="origin">Original Distribution</param> /// <param name="leftBorder">Left Border</param> /// <param name="rightBorder">Right Border</param> public ProportionalTrimmedContinuousDistribution(IContinuousProbabilityDistribution origin, double leftBorder, double rightBorder) : base(origin, leftBorder, rightBorder) { m_Multiplicator = 1.0 / (m_CdfRight - m_CdfLeft); }
/// <summary> /// Random Generator /// </summary> /// <param name="distribution">Distribution to use</param> /// <param name="seed">Seed</param> /// <returns>Random value, distributed according to the distribution</returns> public static ContinuousRandom Random(IContinuousProbabilityDistribution distribution) { if (null == distribution) { throw new ArgumentNullException(nameof(distribution)); } return(new ContinuousRandom(distribution)); }
/// <summary> /// Random Distribution Function (Random Generator) /// </summary> /// <param name="distribution">Distribution to use</param> /// <param name="seed">Seed</param> /// <returns>Random value, distributed according to the distribution</returns> public static ContinuousRandom Rdf(IContinuousProbabilityDistribution distribution, int seed) { if (distribution is null) { throw new ArgumentNullException(nameof(distribution)); } return(new ContinuousRandom(distribution, seed)); }
/// <summary> /// Standard /// </summary> /// <param name="origin">Original Distribution</param> /// <param name="leftBorder">Left Border</param> /// <param name="rightBorder">Right Border</param> public ElevatedTrimmedContinuousDistribution(IContinuousProbabilityDistribution origin, double leftBorder, double rightBorder) : base(origin, leftBorder, rightBorder) { if (LeftBorder != RightBorder) { m_Shift = (1 - (m_CdfRight - m_CdfLeft)) / (RightBorder - LeftBorder); } else { m_Shift = double.NaN; } }
/// <summary> /// Standard constructor /// </summary> /// <param name="distribution">Distribution to use</param> public ContinuousRandom(IContinuousProbabilityDistribution distribution) { m_Random = new ThreadLocal <Random>(() => { int seed; using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider()) { byte[] seedData = new byte[sizeof(int)]; provider.GetBytes(seedData); seed = BitConverter.ToInt32(seedData, 0); } return(new Random(seed)); }); Distribution = distribution ?? throw new ArgumentNullException(nameof(distribution)); }
/// <summary> /// Standard constructor /// </summary> /// <param name="distribution">Distribution to use</param> /// <param name="seed">Seed</param> public ContinuousRandom(IContinuousProbabilityDistribution distribution, int seed) { m_Random = new ThreadLocal <Random>(() => new Random(seed)); Distribution = distribution ?? throw new ArgumentNullException(nameof(distribution)); }