我们在聊天中讨论了标准偏差,所以我决定编写一个标准偏差计算器:
static double PopulationStandardDeviation(List<double> numberSet)
{
double mean = numberSet.Average();
return Math.Sqrt(numberSet.Sum(x => Math.Pow(x - mean, 2)) / numberSet.Count);
}
static double SampleStandardDeviation(List<double> numberSet)
{
double mean = numberSet.Sum() / numberSet.Count;
return Math.Sqrt(numberSet.Sum(x => Math.Pow(x - mean, 2)) / (numberSet.Count - 1));
}如何改善这些情况呢?因为它们都是标准的Devation计算器,我应该将它们合并成一个带有static double StandardDeviation(List<double> numberSet, bool isSample)头的方法吗?它们是这个问题的最佳解决方案吗?
发布于 2015-02-17 07:04:16
有两种方法很好。因为@britishtea在一条评论中这么说的原因--我只想逐字引用它:
将布尔值作为参数并根据该值进行不同行为的方法不是一个方法,而是两个方法!你应该把他们分开。您可以使用共享功能实现coursec,但是您的公共API应该提供两种方法。()- @britishtea
事实上,.NET框架也是这样做的(参见StandardDeviation()和StandardDeviationP(),谢谢@200_success)。
同时,当然不要重复自己。将公共逻辑提取到私有助手方法,然后根据私有方法重写公共方法:
private static double StandardDeviation(List<double> numberSet, double divisor)
{
double mean = numberSet.Average();
return Math.Sqrt(numberSet.Sum(x => Math.Pow(x - mean, 2)) / divisor);
}
static double PopulationStandardDeviation(List<double> numberSet)
{
return StandardDeviation(numberSet, numberSet.Count);
}
static double SampleStandardDeviation(List<double> numberSet)
{
return StandardDeviation(numberSet, numberSet.Count - 1);
}最后,参数名"numberSet“是一个用词不当的词,它指的是一个集合,而它实际上是一个列表。
发布于 2015-02-16 23:09:51
双均值= numberSet.Average();双均值= numberSet.Sum() / numberSet.Count;
在这两种情况下,我都坚持使用numberSet.Average()。
发布于 2015-02-19 14:54:39
就性能而言,使用(x - mean) * (x - mean)而不是Math.Pow(x - mean, 2)。
https://codereview.stackexchange.com/questions/80714
复制相似问题