[英]How can i generate random doubles in C?
我必须通过解决一种自动生成非平凡输入测试数据的方法,将实验数据包含在我的代码中。考虑到我还必须考虑double
精度数的事实,我该怎么做?
这是一些其他上下文。从本书的第139页开始http://mimoza.marmara.edu.tr/~msakalli/cse706_12/SkienaTheAlgorithmDesignManual.pdf ,更准确地说是PDF的第151页,我不得不解决问题4.3,我但是,我需要为该问题生成随机输入,并且由于我必须处理实数,因此很有可能需要生成double
是我不知道在这种情况下我应该选择哪个范围产生实数。
要在[-DBL_MAX ....DBL_MAX]
范围内获得随机double
精度值, [-DBL_MAX ....DBL_MAX]
出现任何double
[-DBL_MAX ....DBL_MAX]
可能性均等,请随机填充一个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到最大值:
double pseudorand(double max)
{
srand((unsigned) time(0));
return (max / RAND_MAX) * rand();
}
或从-max到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
从这个例子改编而成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.