检验概率 我有一个C++应用程序,它基于一些算法选择5个实体中的一个来执行某些动作。

检验概率 我有一个C++应用程序,它基于一些算法选择5个实体中的一个来执行某些动作。,c++,unit-testing,boost,C++,Unit Testing,Boost,我正在编写一个单元测试,以确保所有5个都具有相同的被选择概率。我运行了1000次测试,得到了每个测试被选中多少次的结果。下面是结果示例 202192224195187 如果计数接近200,添加检查将如何正确 我使用的是boost测试库。一个简单的经验法则是,在X/Y%的样本中,通常会得到Y%*X+/-sqrt(X) 这是第二个标准偏差的近似值,因此在+/-sqrt(X)元素范围内的概率大约为95% 您可以使用1.5*sqrt(X)表示3个标准偏差的近似值,这应该在99.7%的时间内发生 您还可以

我正在编写一个单元测试,以确保所有5个都具有相同的被选择概率。我运行了1000次测试,得到了每个测试被选中多少次的结果。下面是结果示例 202192224195187

如果计数接近200,添加检查将如何正确


我使用的是boost测试库。

一个简单的经验法则是,在X/Y%的样本中,通常会得到Y%*X+/-sqrt(X)

这是第二个标准偏差的近似值,因此在+/-sqrt(X)元素范围内的概率大约为95%

您可以使用1.5*sqrt(X)表示3个标准偏差的近似值,这应该在99.7%的时间内发生

您还可以备份并使用奇特的统计数据来获得更精确的答案

对于1000个样本,即sqrt(X)为+/-31,或1.6*sqrt(X)为+/-47

此sqrt规则生成的边界比需要的更宽松

要推导它,从一个Y机会硬币的Var为(1-Y)(Y)的事实开始。注意,该多项式在Y=0.5时为最大值


因此,Var(X coins with prob Y)您试图实现的是“验证”:您想检查您所实现的系统是否符合您的需要。在您的例子中,这意味着您需要检查算法是否以正确的分布传递数据

或者,从另一个角度看同一件事:您没有检查在执行实现时是否出现了一些bug——即使您的代码没有bug,它也可能无法实现您想要的功能

这不是单元测试所针对的那种测试。单元测试是为了“验证”,目的是发现代码中的错误——它不是为了弄清楚您选择的算法是否正确。打个比方:通过单元测试,您可以检查是否正确地实现了快速排序,但它不用于检查您是否应该实现堆排序

这并不是说你的测试目标没有意义——这只是为了解释你正在实施的测试不是通常意义上的单元测试。此外,您的测试缺少单元测试通常应该具备的一个重要特性:确定性


也就是说,您仍然可以使用一种所谓的单元测试框架来实现测试,因为这些框架并不局限于使用它们进行单元测试。我只是建议不要在单元测试中实现和运行这些测试。以相同的频率运行它们也没有什么意义:一旦知道正确选择了算法,就可以编写一些(真实的)单元测试来查找bug/回归。这些单元测试将定期运行,但验证测试不必重新运行。

为您认为“接近200”的设置了一个边界。从结果中减去200,得到绝对值,看看它是否在边界内。@DeiDei那么让我们假设10%,然后200-20