我必须通过解决自动生成非平凡输入测试数据的方法将实验数据包含在我的代码中。考虑到我还必须考虑double
类型的数量,我该怎么做?
这里有一些额外的上下文。从这本书的第139页http://mimoza.marmara.edu.tr/~msakalli/cse706_12/SkienaTheAlgorithmDesignManual.pdf更准确地说是PDF的第151页,我不得不解决问题4.3,我做了。但是我需要为这个问题生成随机输入,因为我必须处理对于实数,很可能需要生成double
数字。问题是我不知道在生成实数时我应该选择哪种范围。
为了获得double
范围内的随机[-DBL_MAX ....DBL_MAX]
,任何double
出现的几率相等,随机填充double
。拒绝非有限的。
#include <math.h>
#include <stdlib.h>
double rand_finite_double(void) {
union {
double d;
unsigned char uc[sizeof(double)];
} u;
do {
for (unsigned i = 0; i < sizeof u.uc; i++) {
u.uc[i] = (unsigned char) rand();
}
} while (!isfinite(u.d));
return u.d;
}
仅给出8位通常产生每次循环迭代的线性效率低。
例如0到max:
double pseudorand(double max)
{
srand((unsigned) time(0));
return (max / RAND_MAX) * rand();
}
或从-max到最大
double pseudorand(double max)
{
srand((unsigned) time(0));
return (rand() > RAND_MAX / 2 ? -1 : 1) *(max / RAND_MAX) * rand();
}
C的rand()
返回一个int,通常为32位。双尾有53位尾数。因此,要创建一个好的随机双倍,你将不得不生成53个随机位。尝试这样的事情:
double rd() {
uint64_t r53 = ((uint64_t)(rand()) << 21) ^ (rand() >> 2);
return (double)r53 / 9007199254740991.0; // 2^53 - 1
}
这将在区间[0,1]中返回一个double
如何在C中生成随机双打?
没有花里胡哨,但会让你开始:
double drand ( double low, double high )
{
srand((unsigned int)clock());
return ( (double)rand() * ( high - low ) ) / (double)RAND_MAX + low;
}
对于low = 10.0;
和high = 1000.0
调用此函数将生成单个值:
10 >= value <= 1000.0
改编自this example。