ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

负二项分布代码实现

2021-12-28 11:33:42  阅读:117  来源: 互联网

标签:1.0 numberOfTrials 实现 double 代码 random 二项分布 trials public


public class NegativeBinomialDistribution : DiscreteDistribution
    {
        private int trials;

        private double p;

        public double ProbabilityOfSuccess => this.p;

        public int NumberOfTrials => this.trials;

        public override double Mean => (double)this.trials * (1.0 - this.p) / this.p;

        public override double Variance => (double)this.trials * (1.0 - this.p) / (this.p * this.p);

        public override double Skewness => (2.0 - this.p) / Math.Sqrt((double)this.trials * (1.0 - this.p));

        public override double Kurtosis => (6.0 - this.p * (6.0 - this.p)) / ((double)this.trials * (1.0 - this.p));

        private void Initialize(int numberOfTrials, double probability)
        {
            if (numberOfTrials < 0)
            {
                ThrowException.ArgumentOutOfRange("numberOfTrials");
            }
            if (probability < 0.0 || probability > 1.0)
            {
                ThrowException.ArgumentOutOfRange("probability");
            }
            this.trials = numberOfTrials;
            this.p = probability;
        }

        private static int GetRandomVariateInternal(System.Random random, int n, double p)
        {
            if (p == 1.0)
            {
                return n;
            }
            if (n == 1)
            {
                return GeometricDistribution.GetRandomVariate(random, p);
            }
            double randomVariate;
            do
            {
                randomVariate = GammaDistribution.GetRandomVariate(random, n, (1.0 - p) / p);
            }
            while (randomVariate == 0.0);
            return PoissonDistribution.GetRandomVariate(random, randomVariate);
        }

        public static int GetRandomVariate(System.Random random, int numberOfTrials, double probabilityOfSuccess)
        {
            if (random == null)
            {
                ThrowException.ArgumentNull("random");
            }
            if (numberOfTrials <= 0)
            {
                ThrowException.ArgumentOutOfRange("numberOfTrials");
            }
            if (probabilityOfSuccess < 0.0 || probabilityOfSuccess > 1.0)
            {
                ThrowException.ArgumentOutOfRange("probabilityOfSuccess");
            }
            return new NegativeBinomialDistribution(numberOfTrials, probabilityOfSuccess).GetRandomVariate(random);
        }

        public NegativeBinomialDistribution(int numberOfTrials, double probabilityOfSuccess)
        {
            if (numberOfTrials <= 0)
            {
                ThrowException.ArgumentOutOfRange("numberOfTrials");
            }
            if (probabilityOfSuccess < 0.0 || probabilityOfSuccess > 1.0)
            {
                ThrowException.ArgumentOutOfRange("probabilityOfSuccess");
            }
            this.Initialize(numberOfTrials, probabilityOfSuccess);
        }

        public override double Probability(int n)
        {
            if (n < this.trials)
            {
                return 0.0;
            }
            if (this.p == 1.0)
            {
                if (n == this.trials)
                {
                    return 1.0;
                }
                return 0.0;
            }
            return Combinatorics.Combinations(n + this.trials - 1, this.trials - 1) * ElementaryFunctions.Pow(this.p, this.trials) * ElementaryFunctions.Pow(1.0 - this.p, n);
        }

        public override double DistributionFunction(int n)
        {
            return GammaFunctions.RegularizedBeta(this.trials, (double)n + 1.0, this.p);
        }

        public override int GetRandomVariate(System.Random random)
        {
            if (random == null)
            {
                ThrowException.ArgumentNull("random");
            }
            return NegativeBinomialDistribution.GetRandomVariateInternal(random, this.trials, this.p);
        }
    }

 如果对您有帮忙,非常感谢您支持一下创造者的付出!

 感谢支持技术分享,请扫码点赞支持:

技术合作交流qq:2401315930

标签:1.0,numberOfTrials,实现,double,代码,random,二项分布,trials,public
来源: https://blog.csdn.net/weixin_42496466/article/details/122188892

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有