예제 #1
0
        /// <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");
            }
        }
예제 #2
0
 /// <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));
        }
예제 #4
0
        /// <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));
        }
예제 #5
0
 /// <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;
     }
 }
예제 #6
0
        /// <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));
        }
예제 #7
0
 /// <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));
 }