You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi/Pascal中与MS-Excel NormDist函数等效的实现是什么?

解决Delphi中模拟Excel NormDist函数的方案

1. 手动实现NormDist逻辑

Excel的NormDist(x, mean, standard_dev, cumulative)函数分两种工作模式:

  • 当cumulative为False时,返回正态分布概率密度函数
  • 当cumulative为True时,返回累积分布函数

概率密度函数实现

直接基于正态分布的数学公式编写代码:

function NormDistPDF(x, Mean, StdDev: Double): Double;
const
  Sqrt2Pi = 2.5066282746310005; // 预计算sqrt(2*pi)的近似值
var
  Z: Double;
begin
  if StdDev <= 0 then
    raise Exception.Create('标准差必须大于0');
  Z := (x - Mean) / StdDev;
  Result := Exp(-Z*Z/2) / (StdDev * Sqrt2Pi);
end;

累积分布函数实现

借助Delphi自带Math单元的Erf(误差函数)完成计算,正态累积分布与误差函数的转换关系为:
$$\Phi(z) = \frac{1}{2}\left(1 + \text{Erf}\left(\frac{z}{\sqrt{2}}\right)\right)$$
其中$z = \frac{x-\text{mean}}{\text{stddev}}$

代码实现:

uses Math;

function NormDistCDF(x, Mean, StdDev: Double): Double;
var
  Z: Double;
begin
  if StdDev <= 0 then
    raise Exception.Create('标准差必须大于0');
  Z := (x - Mean) / (StdDev * Sqrt(2));
  Result := 0.5 * (1 + Erf(Z));
end;

整合为完整的NormDist函数

合并两种逻辑,完全匹配Excel的参数规则:

uses Math;

function NormDist(x, Mean, StdDev: Double; Cumulative: Boolean): Double;
begin
  if Cumulative then
    Result := NormDistCDF(x, Mean, StdDev)
  else
    Result := NormDistPDF(x, Mean, StdDev);
end;

2. 利用第三方数学库

如果不想手动实现,也可以使用成熟的Delphi数学库简化开发:

  • Delphi Math Library (DML):内置完整的统计分布函数集
  • TeeChart:其统计组件包含正态分布计算,适合同时需要图表展示的场景

手动实现的优势是无需额外依赖,更适合打包成独立可执行文件分享给用户。

内容的提问来源于stack exchange,提问作者ezcomezgo11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:51:13