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