C 如何对随机生成器函数进行单元测试?

C 如何对随机生成器函数进行单元测试?,c,unit-testing,random,C,Unit Testing,Random,我用C编写了下面的4-liner函数作为辅助函数,但现在我发现它的用处超出了我的预期,我想在测试中介绍它 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

我用C编写了下面的4-liner函数作为辅助函数,但现在我发现它的用处超出了我的预期,我想在测试中介绍它

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);
}
我写了这篇评论并相信它是真的,但是没有测试我怎么能做到呢

我可以很容易地测试返回值是否在范围内,但是如何编写一个测试来确定它是否实际均匀分布?如果我简单地运行它一百万次并检查它是否符合某个公差范围内的均匀分布,最终它将超过该公差并错误地失败


我知道可能已经有这样的图书馆了;这更多的是个人练习(他们如何进行测试?

使用Diehard框架。如果生成的数字有问题,它将警告您。rand()函数的使用已经是一个问题,因为它没有通过Diehard测试。

使用Diehard框架。如果生成的数字有问题,它将警告您。rand()函数的使用已经是一个问题,因为它没有通过Diehard测试。

这是否回答了您的问题?如果看不到规范(函数应该做什么的详细枚举),就不可能正确地知道如何进行测试。例如,可接受的输入范围是否包括负值?顺便说一句,这个表达式:
(x==0)
在处理
双重比较时不有用。i、 e.
0.0000000000 1
可能接近于零,但它不会通过比较。
如何编写测试来确定它是否实际均匀分布?
将[min,max]拆分为大小相等的
n
子范围。保持计数与每个子范围关联。生成一个值。递增与该值所在的子范围关联的计数。根据您想要获得的精度,重复此操作以获得尽可能多的值。如果子范围的计数(接近)相等,则表示它是一致的。例如,做一个直方图,看看它是否是一条直线。@mousetail是的,它让我确信我不能。@ryker规范在函数的注释中-均匀分布在最小值和最大值之间,可以是任何双值。谢谢你的==建议-我会在翻倍之前做检查。这能回答你的问题吗?如果看不到规范(函数应该做什么的详细枚举),就不可能正确地知道如何进行测试。例如,可接受的输入范围是否包括负值?顺便说一句,这个表达式:
(x==0)
在处理
双重比较时不有用。i、 e.
0.0000000000 1
可能接近于零,但它不会通过比较。
如何编写测试来确定它是否实际均匀分布?
将[min,max]拆分为大小相等的
n
子范围。保持计数与每个子范围关联。生成一个值。递增与该值所在的子范围关联的计数。根据您想要获得的精度,重复此操作以获得尽可能多的值。如果子范围的计数(接近)相等,则表示它是一致的。例如,做一个直方图,看看它是否是一条直线。@mousetail是的,它让我确信我不能。@ryker规范在函数的注释中-均匀分布在最小值和最大值之间,可以是任何双值。谢谢你的==建议-我会在翻倍之前做检查。