c# NormalDistribution 实现

c# NormalDistribution implementation

我需要 System.Web.DataVisualization.dllNormalDistribution 函数的 C# 实现(源代码),我尝试使用 github 中已有的函数来计算 NORM.S.DIST但它们不准确且与 excel 值不匹配。

下面是我使用的代码,对于 13.803404798240017 的输入,它给出了 1.2664557440189636E-43(几乎为零)。另一方面,excel 和 DataVisualization 中的 NormalDistribution 函数返回 1 作为结果。

public static double NS(double zValue)
{
    const double b1 = 0.319381530;
    const double b2 = -0.356563782;
    const double b3 = 1.781477937;
    const double b4 = -1.821255978;
    const double b5 = 1.330274429;
    const double p = 0.2316419;
    const double c = 0.39894228;

    if (zValue >= 0.0)
    {
        double t = 1.0 / (1.0 + p * zValue);
        return (1.0 - c * Math.Exp(-zValue * zValue / 2.0) * t * (t * (t * (t * (t * b5 + b4) + b3) + b2) + b1));
     }
     else
     {
         double t = 1.0 / (1.0 - p * zValue);
         return (c * Math.Exp(-zValue * zValue / 2.0) * t * (t * (t * (t * (t * b5 + b4) + b3) + b2) + b1));
      }
}

我尝试 ILSpy 查看 DataVisualization.dll 中的代码,但没有成功,请建议我们如何获取该源代码(如果可能),我认为 MS 已经开源了他们的 .Net 代码基础,但并非所有程序集都如此。还是有更好的方法来准确计算 NORM.S.DIST ?

谢谢!!

一旦你检查了这样做的法律方面,如果 Ms 没有限制(例如关于许可类型),那么你可以使用 dotPeek 将任何程序集反编译成C#

您提到的两次计算之间的差异可能是由于密度分布和累积分布之间的差异造成的。对于 13.80 的 z 值,密度函数几乎为 0,而累积分布实际上为 1。 excel 函数 NORMAL.S.DISTR(z,cumulative) 允许将此差异指定为参数。 我建议查看这两种实现,以确保它们都是累积的或密度的。 关于替代库,我会推荐 NuGet 包:"MathNet.Numerics" 这个包包含几个统计分布的实现。