C++ log和rand()不提供数字

C++ log和rand()不提供数字,c++,random,vector,while-loop,C++,Random,Vector,While Loop,在代码的以下部分: 我想生成一个从0到1的随机数“U”, 然后我计算一个有对数的方程 错误是:U的某个值使等式中的对数给出“非数字”值 我试着将“U”转换为浮点或双精度,甚至四舍五入到小数点后2位,但同样的错误 vector <double>Xs;//random Xs double x; double U; while (check_arr < 360) { U = ((rand() / RAND_MAX) * 100) / 100;

在代码的以下部分:

我想生成一个从0到1的随机数“U”, 然后我计算一个有对数的方程

错误是: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);

    }
vectorxs//随机X
双x;
双U;
同时(检查\u arr<360)
{
U=((rand()/rand_MAX)*100)/100;
x=(log10(1-U))/(-1/a);
Xs.推回(x);
}
将在传递给它的参数为0时返回“非数字”。当我在我的机器上运行该方法时,得到的结果是“-1.#inf000000000000000000”<代码>日志(0)是无效数字。您可以通过打开电脑上的计算器(如果使用windows)来验证这一点,切换到科学模式,然后尝试执行日志0

数学解释:

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

10^y=0
但是没有解决方案,因此函数将返回一个无效的数字。如果将x值的范围设置为0,则会更好。当传递给它的参数为0时,日志(0)是无效数字。您可以通过打开电脑上的计算器(如果使用windows)来验证这一点,切换到科学模式,然后尝试执行日志0

数学解释:

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

10^y=0

但是没有解决方案,因此函数将返回一个无效的数字。如果将x值的范围设置为0 rand()返回一个整数,rand_MAX是一个整数,所以当你除以它们时,你会得到一个几乎总是零的整数(因为rand()可以产生rand_MAX的值,在我的计算机上是2^31中的一次,而这个除法会产生1)

其次,乘以然后除以100等于零。结果是一样的:一个几乎总是0的整数,有时是1

最后,您必须避免使用log10的零。此值是不允许的,将引发除零异常(同时,负值将引发无效浮点异常)

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

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

这将为您提供一个U值,其分布范围为0.00到0.99(含0.99)。当您使用log10(1-U)时,不会出现异常。

您的代码存在多个问题

rand()返回一个整数,rand_MAX是一个整数,所以当你除以它们时,你会得到一个几乎总是零的整数(因为rand()可以产生rand_MAX的值,在我的计算机上是2^31中的一次,而这个除法会产生1)

其次,乘以然后除以100等于零。结果是一样的:一个几乎总是0的整数,有时是1

最后,您必须避免使用log10的零。此值是不允许的,将引发除零异常(同时,负值将引发无效浮点异常)

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

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

这将为您提供一个U值,其分布范围为0.00到0.99(含0.99)。当你取log10(1-U)时,你不会得到异常。

如果
U
变为1会发生什么?如果
U
变为1会发生什么?注意:虽然你的想法有些正确,
(rand()%99)/100.0
有两个原因是错误的。首先,它需要是模100,而不是99,第二,使用非二次幂的模意味着坏的业力(它“看起来不错”,但实际上分布是有偏差的,这可能会产生难以确定的奇怪问题)<代码>(rand()&255)/255.0要好得多。关于99对100的比较非常正确-我在上面编辑了它-很抱歉给您带来了错误。但在分配方面,;如果OP在意,那么他就不应该使用rand(),因为标准实现(乘法同余PRNG)的低位熵非常差。使用任何模运算都会使情况变得更糟,而不是更好,而且可以说二次幂运算比十进制运算更糟。我除以100.0,因为他说他曾尝试四舍五入到小数点后2位,这就是原因。注意:虽然你的想法有些正确,
(rand()%99)/100.0
有两个原因是错误的。首先,它需要是模100,而不是99,第二,使用非二次幂的模意味着坏的业力(它“看起来不错”,但实际上分布是有偏差的,这可能会产生难以确定的奇怪问题)<代码>(rand()&255)/255.0要好得多。关于99对100的比较非常正确-我在上面编辑了它-很抱歉给您带来了错误。但在分配方面,;如果OP在意,那么他就不应该使用rand(),因为标准实现(乘法同余PRNG)的低位熵非常差。使用任何模运算都会使情况变得更糟,而不是更好,而且可以说二次幂运算比十进制运算更糟。我除以100.0,因为他说他试着四舍五入到小数点后2位,这就是它的作用。