繁体   English   中英

如何在C中生成随机双打?

[英]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();
}

https://onlinegdb.com/SyqGH9PqN

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM