[当我调用calc()时,他没有给我x的第一个返回值,相反,他跳回了double x = v1*sqrt((-(2.0*log(s)))/s);
并第二次计算x,然后返回nan。
调试器向我显示,在他第一次尝试返回x之前,x的值为-0.525209。我认为这将是一个可接受的返回值(双精度)。
有人知道如何解决这个问题,或者他为什么跳回去吗? (对不起,我仍然是C ++的初学者)
#include <cmath>
#include <cstdlib>
#include <iostream>
double calc(){
double u1 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
double u2 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
double v1 = (2.0*u1)-1.0;
double v2 = (2.0*u2)-1.0;
double s = pow(v1, 2.0)+pow(v2, 2.0);
if (s >= 1.0){
calc();
}
double x = v1*sqrt((-(2.0*log(s)))/s);
std::cout << "before return " << x << std::endl;
return x;
}
int main(){
double hilfe = calc();
std::cout << "my mumber "<< hilfe << std::endl;
}
我想你想要这个:
#include <cmath>
#include <cstdlib>
#include <iostream>
double calc(){
for (;;) {
double u1 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
double u2 = static_cast <double> (rand()) / static_cast <double> (RAND_MAX);
double v1 = (2.0*u1)-1.0;
double v2 = (2.0*u2)-1.0;
double s = pow(v1, 2.0)+pow(v2, 2.0);
if (s >= 1.0)
continue;
double x = v1*sqrt((-(2.0*log(s)))/s);
std::cout << "before return " << x << std::endl;
return x;
}
}
int main(){
double hilfe = calc();
std::cout << "my mumber "<< hilfe << std::endl;
}
这将选择新的randoom值,直到s <1;