log和rand()不给出数字

时间:2015-10-08 21:55:52

标签: c++ random vector while-loop

在以下部分代码中:

我想生成一个随机数" U"从0到1的范围, 然后我计算一个有log

的方程式

错误是:U的某个值使等式中的对数给出"而不是数字"值

我试过施展" U"浮动或加倍或甚至将其舍入到2位小数但相同的错误

vector <double>Xs;//random Xs
double x;
double U;

   while (check_arr < 360)
    {

        U = ((rand() / RAND_MAX) * 100) / 100;
        x = (log10(1 - U)) / (-1 / a);
        Xs.push_back(x);

    }

2 个答案:

答案 0 :(得分:4)

您的代码存在多个问题。

rand()返回一个整数,RAND_MAX是一个整数,所以当你划分它们时你会得到一个几乎总是为零的整数(因为rand()可以产生值RAND_MAX - 一次在2 ^ 31上我的计算机 - 该部门将产生1)。

接下来,乘以然后除以100无效。结果将是相同的:一个几乎总是0的整数,有时是1。

最后,您必须避免将log10设为零。不允许使用此值并将提高除零异常(同样,负值会引发无效的浮点异常)。

也许您可以使用以下表达式:

U = (rand() % 100)/100.0;

这将为您提供U值,其分布范围为0.00到0.99(含)。当你拿到log10(1-U)时,你不会得到例外。

答案 1 :(得分:1)

当传递给它的参数为0时,

log10()将返回“not a number”。当我在我的机器上运行该方法时,我得到的结果是“-1。#INF000000000000”。 log(0)是无效的号码。您可以通过在PC上打开计算器来验证这一点(如果您使用的是Windows),切换到科学模式然后尝试记录0。

数学解释:

log base 10函数用于帮助查找y中的指数10^y=x。因此,当您尝试在函数中插入0时,您正试图找到以下解决方案:

10^y=0

但是没有解决方案,因此该函数将返回无效数字。如果将x值的范围设置为0 <更好,那会更好。 x&lt; = 1,因此您不会遇到同样的问题。

由于rand函数返回的值介于0和RAND-MAX之间,因此您可以使用以下内容确保不会在日志函数中输入0:

U = (rand() % 100 + 1)/100;

这将返回0.01和1的范围。您可以乱用数字来增加/减小范围。