public class PoissonDistribution : DiscreteDistribution
{
private double mean;
public override double Mean => this.mean;
public override double Variance => this.mean;
public override double Skewness => 1.0 / Math.Sqrt(this.mean);
public override double Kurtosis => 1.0 / this.mean;
private static int GetRandomVariateInternal(System.Random random, double mean)
{
int num;
num = 0;
while (mean > 12.0)
{
int num2;
num2 = (int)Math.Floor(mean * 0.875);
double randomVariate;
randomVariate = GammaDistribution.GetRandomVariate(random, num2);
if (randomVariate > mean)
{
return num + BinomialDistribution.GetRandomVariate(random, num2 - 1, mean / randomVariate);
}
num += num2;
mean -= randomVariate;
}
double num3;
num3 = Math.Exp(0.0 - mean);
for (double num4 = random.NextDouble(); num4 >= num3; num4 *= random.NextDouble())
{
num++;
}
return num;
}
public static int GetRandomVariate(System.Random random, double mean)
{
if (random == null)
{
ThrowException.ArgumentNull("random");
}
if (mean <= 0.0)
{
ThrowException.ArgumentOutOfRange("mean");
}
return PoissonDistribution.GetRandomVariateInternal(random, mean);
}
public PoissonDistribution(double mean)
{
this.mean = mean;
}
public PoissonDistribution(NumericalVariable variable)
{
if (variable == null)
{
ThrowException.ArgumentNull("variable");
}
this.mean = variable.Mean;
}
public override double Probability(int n)
{
if (n < 0)
{
return 0.0;
}
return Math.Exp((double)n * Math.Log(this.mean) - Combinatorics.LogFactorial(n) - this.mean);
}
public override double DistributionFunction(int n)
{
if (n < 0)
{
return 0.0;
}
return GammaFunctions.RegularizedGammaQ(n + 1, this.mean);
}
public override int GetRandomVariate(System.Random random)
{
if (random == null)
{
ThrowException.ArgumentNull("random");
}
return PoissonDistribution.GetRandomVariateInternal(random, this.mean);
}
}
如果对您有帮忙,非常感谢您支持一下创造者的付出!
感谢支持技术分享,请扫码点赞支持:
技术合作交流qq:2401315930