【发布时间】:2021-01-16 06:10:59
【问题描述】:
我用 C 语言编写了以下 4 行代码作为辅助函数,但现在我发现它的用途超出了我的预期,并希望在我的测试中涵盖它。
double random_double_in_range(double min, double max) {
// This cannot overflow, no matter the values of min, max and x.
// It will return an uniformly distributed double
// between min and max, inclusive.
int n = rand();
if (n==0) return min;
double x = (double) n;
return x * (max / RAND_MAX - min / RAND_MAX + min / x);
}
我写了评论并相信它是真实的,但我怎么能真的没有测试呢?
我可以很容易地测试返回值是否在范围内,但是我如何编写一个测试来确定它是否实际上是均匀分布的?如果我简单地运行它一百万次并检查它是否符合某个容差内的均匀分布,最终它会超过该容差并虚假地失败。
我知道可能已经存在执行此操作的库;这更像是一种个人练习(他们如何进行测试?)
【问题讨论】:
-
如果没有看到规范(函数应该做什么的详细枚举),就不可能正确地知道如何测试。例如。可接受输入的范围是否包括负值?顺便说一句,这个表达式:
(x == 0)在处理double比较时没有用。即0.00000000001可能足够接近于零,但它不会通过比较。 -
how can I write a test that determines whether it is actually uniformly distributed?将 [min,max] 拆分为n大小相等的子范围。保持与每个子范围相关的计数。生成一个值。增加与该值所在的子范围关联的计数。根据您想要获得的精度重复尽可能多的值。如果子范围的计数(接近)相等,则表示它是均匀的。 IE。做一个直方图,看看它是否是一条直线。 -
@mousetail 是的,它让我相信我做不到。
-
@ryyker 规范在函数的注释中 - 均匀分布在 min 和 max 之间,可以是任何 double 值。感谢您的 == 建议 - 我会在转换为 double 之前进行检查。
标签: c unit-testing random