我正在尝试编写一个c ++代码来计算积分b / n两个数字(a,b)。
我编写了以下顺序代码,但我需要知道的是,为了以更快的方式生成随机数,最好的方法是对这些代码进行分析。这个c ++线程中的随机数生成器是否安全?
我使用的整合公式是:
I = sum(f(xi))* dx和dx =(b-a)/ n
double fun(double x) //f(x) = x;
{
return x;
}
double MonteCarloIntegration (double a, double b, int n)
{
if(a > b){
return MonteCarloIntegration(b, a, n);
}
double sum = 0.0;
double r= 0.0;
for (int i = 1; i <= n; i++)
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double> dis(0.0, 1.0);
r = dis(gen);
sum = sum + fun(a+((b-a)*r));
}
sum = ((b-a)/n)*sum;
return sum;
}
int main(int argc,char * argv[]) {
if (argc < 2) {
std::cerr << "use: " << argv[0]
<< " Numer_of_Random_samples (n) \n";
std::cerr << " Example:\n " << argv[0] << " 1000000 \n\n";
return -1;
}
double b = 4.0; //lower bound
double a = 7.0; //upper bound
int n = atoi(argv[1]);
std::cout <<MonteCarloIntegration(a,b,n);
return 0;
}
答案 0 :(得分:-1)
在这里,我重写了您的代码以使用OpenMP
#include <random>
#include <iostream>
double fun(double x) //f(x) = x;
{
return x;
}
double MonteCarloIntegration (double a, double b, int n)
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double> dis(0.0, 1.0);
if(a > b)
{
return MonteCarloIntegration(b, a, n);
}
double sum = 0.0;
#pragma omp parallel for reduction(+:sum)
for (int i = 1; i <= n; i++)
{
double r = dis(gen);
sum = sum + fun(a+((b-a)*r));
}
sum = ((b-a)/n)*sum;
return sum;
}
int main(int argc,char * argv[]) {
if (argc < 2)
{
std::cerr << "use: " << argv[0]
<< " Numer_of_Random_samples (n) \n";
std::cerr << " Example:\n " << argv[0] << " 1000000 \n\n";
return -1;
}
double b = 4.0; //lower bound
double a = 7.0; //upper bound
int n = atoi(argv[1]);
std::cout << MonteCarloIntegration(a,b,n) << std::endl;
return 0;
}
以这种方式编译
g++ -O3 -fopenmp integrate-mc.cxx -std=c++11 -o integrate-mc