C++ 编写蒙特卡罗积分程序,我不';为什么我会犯某些错误

C++ 编写蒙特卡罗积分程序,我不';为什么我会犯某些错误,c++,c++11,optimization,montecarlo,C++,C++11,Optimization,Montecarlo,我正在写一个蒙特卡罗程序来做10D积分。但我首先尝试的是在提升到更高的层次之前,让完整的方法在较低的维度中工作。无论如何,我有这个程序,它使用的是数字配方中给出的结构随机数生成器。现在,当我运行一个程序并只输出随机数时,它工作得很好,当我使用内置的rand函数进行实际积分时也是如此。问题是,当我将两者结合在一起时,我以调用RNG结构的方式得到它,它表示我正在对我试图调用此结构的两个实例使用“of undeclared identifier”。我真的不知道它为什么会抛出这个错误,以及如何修复它。如

我正在写一个蒙特卡罗程序来做10D积分。但我首先尝试的是在提升到更高的层次之前,让完整的方法在较低的维度中工作。无论如何,我有这个程序,它使用的是数字配方中给出的结构随机数生成器。现在,当我运行一个程序并只输出随机数时,它工作得很好,当我使用内置的rand函数进行实际积分时也是如此。问题是,当我将两者结合在一起时,我以调用RNG结构的方式得到它,它表示我正在对我试图调用此结构的两个实例使用“of undeclared identifier”。我真的不知道它为什么会抛出这个错误,以及如何修复它。如有任何建议,将不胜感激。我引用的代码是,错误声明为

montest.cpp:50:17:错误:使用未声明的标识符“rndvar”
双u1=rndvar.int64();
Montetest.cpp:51:17:错误:使用未声明的标识符“rndvar”
双u2=rndvar.int64();“

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构运行{
/* 
实现最高质量的推荐生成器。构造函数
被称为
整数种子并创建生成器的实例。成员
函数int64,doub,
和int32以变量类型返回随机序列中的下一个值
表示
发电机的周期大约是3.138 x 10^57。
*/
无符号长u、v、w;
Ran(无符号长j):v(410184288765102017LL),w(1){
//构造函数。使用任何整数种子调用(上面v的值除外)。
u=j^v;int64();
v=u;int64();
w=v;int64();
}
内联无符号长int64(){
//返回64位随机整数。
u=u*286293355577941757LL+7046029254386353087LL;
v^=v>>17;v^=v>8;
w=4294957665U*(w&0xffffffff)+(w>>32);
无符号长x=u^(u>35;x^=x ycoord){
收件箱++;
}
}
双倍密度=收件箱/总数;

std::cout
rndvar
main
中声明,但在
integral
函数中使用

rndvar
传递给
integral
函数,或在
integral
函数中声明,或将其作为全局变量(通常不推荐)


在C++11中,您不需要实现自己的伪随机数生成器。您可以使用标准的伪随机数生成器,请参见中的示例。

如果我错了,请纠正我,但我认为问题在于您的rndvar是在整数函数之外声明和初始化的。这意味着integral()不了解rndvar,因为它不在integral()的范围内


尝试将rndvar作为参数传递给integral(),我相信这会解决您的问题。

rndvar
是在
main
中声明的,您试图在另一个函数中使用它-错误是不言自明的
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;


struct Ran {
/* 
 Implementation of the highest quality recommended generator. The constructor 
is called with
 an integer seed and creates an instance of the generator. The member 
functions int64, doub, 
 and int32 return the next values in the random sequence, as a variable type 
indicated by 
 their names. The period of the generator is roughly 3.138 x 10^57.
*/
   unsigned long u,v,w;
   Ran(unsigned long j) : v(4101842887655102017LL), w(1) {
// Constructor. Call with any integer seed (except value of v above).
      u = j ^ v; int64();
      v = u; int64();
      w = v; int64();
   }
   inline unsigned long int64() {
// Return 64-bit random integer.
      u = u * 2862933555777941757LL + 7046029254386353087LL; 
      v ^= v >> 17; v ^= v << 31; v ^= v >> 8;
      w = 4294957665U*(w & 0xffffffff) + (w >> 32);
      unsigned long x = u ^ (u << 21); x ^= x >> 35; x ^= x << 4; 
      return (x + v) ^ w;
   }
   inline double doub() { return 5.42101086242752217E-20 * int64(); }
 // Return random double-precision floating value in the range 0. to 1.
   inline unsigned int int32() { return (unsigned int)int64(); }
// Return 32-bit random integer.
};


//int count;
double total, inBox;

// user defined function below
double f (double x){
  return exp(cos(x));
}
//

//function to calculate a definite integral given bounds of integration 
(xmin/max) & bounds of function (ymin/ymax)
double integral (double (*f)(double), double xmin, double xmax, double ymin, 
double ymax,int n){
  for (int count=0; count < n; count++){
    double u1 = rndvar.int64();
    double u2 = rndvar.int64();

    double xcoord = ((xmax - xmin)*u1) + xmin;
    double ycoord = ((ymax - ymin)*u2) + ymin;
    double val = f(xcoord);

     total++;

    if (val > ycoord){
      inBox++;
    }
  }

  double density = inBox/total;

  std::cout<<(xmax - xmin)*(ymax - ymin)*density<<std::endl;
}


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

   if(argc != 3) {
      printf("Need 2  arguments: seed  n\n");
      exit(0);
   }

   unsigned long iseed=atol(argv[1]);
   int n=atoi(argv[2]);   // number of steps
   vector <int> test;

   Ran rndvar(iseed);

   cout<< "RESULT: " <<endl;
   integral(f,-2,2,0,4,n);
}