c#NormalDistribution实现

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

下面是我使用的代码,它给了我1.2664557440189636E-43(几乎为零),input13.803404798240017。 另一方面,在NormalDistribution excel和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查看ILSpy中的代码,但没有运气,请build议如何获得该源代码(如果可能),我以为MS已经开源了他们的.Net代码库,但是对于所有程序集来说并不是这样。 还是有更好的方法来准确计算NORM.S.DIST?

谢谢!!

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

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