C++ C++;蒙特卡罗积分:如何在不求和结果的情况下多次运行代码?

C++ C++;蒙特卡罗积分:如何在不求和结果的情况下多次运行代码?,c++,integration,montecarlo,C++,Integration,Montecarlo,这是我更改代码以包含多次运行的功能之前的代码: #include <iostream> #include <fstream> #include <stdlib.h> #include <math.h> #include <random> #include <iomanip> #include <vector> using namespace std; int main () { double vol

这是我更改代码以包含多次运行的功能之前的代码:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <math.h>
#include <random>
#include <iomanip>
#include <vector>

using namespace std; 

int main () {
    double vol;
    double hit;
    int samples;
    int i, j;
    double sum;
    double pt;
    double actual_vol;
    const double PI = 2.0*atan2(1.0,0.0);
    double abs_err;
    double rel_err;

    random_device dev;
    default_random_engine e{ dev() };
    uniform_real_distribution<double> u{0.0,1.0};

    samples = 1000000 * dim;

    actual_vol = pow(PI, double(dim/2.0)) / exp(lgamma(double(dim/2.0)+1.0));

    for (i = 0; i < samples; i++) {
            sum = 0;
            for (j = 0; j < dim; j++) {
                    pt = 2*(u(e)-0.5);
                    sum += pt*pt;
            }
            if (sqrt(sum) < 1) {
                    hit += 1;
            }
    }

    vol = ( pow(2,dim) * hit ) / samples;
    abs_err = fabs( actual_vol - vol);
    rel_err = abs_err / actual_vol;

    cout << "Average volume of your sphere: " << setprecision(7) << vol << endl;
    cout << "Actual volume: " << setprecision(7) << actual_vol << endl;
    cout << "Absolute Error: " << setprecision(7) << abs_err << endl;
    cout << "Relative Error: " << setprecision(7) << rel_err << endl;
}
现在,当我更改它以便调用该函数并多次运行它时,使用以下代码:

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <math.h>
#include <random>
#include <iomanip>
#include <vector>

using namespace std;

double monte_carlo (int dim) {
    double vol;
    double hit;
    int samples;
    int i, j;
    double sum;
    double pt;
    double actual_vol;
    const double PI = 2.0*atan2(1.0,0.0);
    double abs_err;
    double rel_err;

    random_device dev;
    default_random_engine e{ dev() };
    uniform_real_distribution<double> u{0.0,1.0};

    samples = 1000000 * dim;

    actual_vol = pow(PI, double(dim/2.0)) / exp(lgamma(double(dim/2.0)+1.0));

    for (i = 0; i < samples; i++) {
            sum = 0;
            for (j = 0; j < dim; j++) {
                    pt = 2*(u(e)-0.5);
                    sum += pt*pt;
            }
            if (sqrt(sum) < 1) {
                    hit += 1;
            }
    }

    vol = ( pow(2,dim) * hit ) / samples;
    abs_err = fabs( actual_vol - vol);
    rel_err = abs_err / actual_vol;

    cout << "Average volume of your sphere: " << setprecision(7) << vol << endl;
    cout << "Actual volume: " << setprecision(7) << actual_vol << endl;
    cout << "Absolute Error: " << setprecision(7) << abs_err << endl;
    cout << "Relative Error: " << setprecision(7) << rel_err << endl;
}

int main (int argc, char* argv[]) {

    int dim = 0;
    int runs = 0;
    int i;

    dim =  atoi(argv[1]);
    runs = atoi(argv[2]);

    for (i = 0; i < runs; i++) {
            monte_carlo(dim);
    }

    return 0;
}
你会注意到球体平均体积的第一个值大约是3.14,然后是第二个实例,现在是6.28(或者是第一个的两倍),第三个实例是9.42(大约是第一个的三倍),等等

它应该做的是在每次运行时运行一个新的计算,每个计算的值都应该在3.14左右徘徊。如何让它停止对上一次运行的值求和


谢谢

这可能是因为您从未重新初始化变量

您还具有很强的“旧”C偏差(C头、使用
atoi
fabs
…),在需要时声明变量,而且您的路径总是相似的,因为您使用相同的随机数生成器和相同的种子(默认构造)

不过,对于你的问题:

double hit = 0;
double samples = 0;
等等


同样对于PI,如果您有boost,请使用它的常量,而不是以低于它所能提供的精度重新计算它。

这可能是因为您从未重新初始化变量

您还具有很强的“旧”C偏差(C头、使用
atoi
fabs
…),在需要时声明变量,而且您的路径总是相似的,因为您使用相同的随机数生成器和相同的种子(默认构造)

不过,对于你的问题:

double hit = 0;
double samples = 0;
等等


同样对于PI,如果你有boost,使用它的常数,而不是以比它能提供的更低的精度重新计算它。

哦,伙计,我真不敢相信我错过了那一个,谢谢,伙计,那就是它。还有,强C偏差的后果是什么?有否定的吗?由于相同的随机数生成器,如何解决类似路径的问题?我的建议是将此函数放在一个类中,该类将使用数字生成器作为成员变量。@KeithJF1 C偏差的后果之一(并且仅在旧C中需要)在函数顶部定义一组变量可以使使用未定义的值更容易。如果你等着定义一个变量,直到你有了一个值来初始化它,你就不能了。哦,伙计,我不敢相信我错过了那个,谢谢你,伙计,就是这样。还有,强C偏差的后果是什么?有否定的吗?由于相同的随机数生成器,如何解决类似路径的问题?我的建议是将此函数放在一个类中,该类将使用数字生成器作为成员变量。@KeithJF1 C偏差的后果之一(并且仅在旧C中需要)在函数顶部定义一组变量可以使使用未定义的值更容易。如果您等待定义一个变量,直到您有一个值来初始化它,您就不能。
double hit = 0;
double samples = 0;