我正在尝试为蒙特卡洛集成生成一些统一的实数,但我构建的例程返回了一些非常奇怪的值。仔细观察后,我注意到Boost正在返回一些疯狂的随机数字,例如:
temp = -0.185276
temp = -0.864523
temp = -0.0942081
temp = -0.164991
temp = -0.873013
temp = -0.0311322
temp = -0.0866241
temp = -0.778966
temp = -0.367641
temp = -0.691833
temp = 5.66499e-310
temp = 9.42007e-311
temp = 6.29821e-310
temp = 5.80603e-310
temp = 8.82973e-311
temp = 6.73679e-310
temp = 6.35094e-310
temp = 1.53691e-310
temp = 4.39696e-310
temp = 2.14277e-310
虽然这些数字在技术上仍然是在-1和1之间产生的实数,但如果它们不是那么小的话我会更喜欢它!
我对boost调用的实现是在一个多次调用的函数中(对于不同的边界值),如下所示:
// Define Boost typedefs
typedef boost::mt19937 Engine;
typedef boost::uniform_real<double> Distribution;
typedef boost::variate_generator <Engine, Distribution> Generator;
int main (void) {
...
Integral = MCRecursion(...);
...
return 0;
}
double MCRecursion (int Count, double Lower, double Upper, double (*Integrand)(double)) {
// Define Boost objects
Engine Eng;
Distribution Dist (Lower, Upper);
Generator RandomGen (Eng, Dist);
Eng.seed(time(0));
// Variables for Monte Carlo sample sums
double Sum = 0.0;
double temp;
for (int i = 0; i < Count; i++) {
temp = RandomGen();
std::cout << " temp = " << temp << std::endl;
Sum += Integrand(temp);
}
return (Upper - Lower) * Sum / Count;
}
我认为问题与我的实现有关,但我找不到任何错误。任何和所有帮助表示赞赏! 干杯, 千斤顶
调用MCRecursion的代码:
我正在编写的代码在我感兴趣的整个域上运行蒙特卡罗[Lower,Upper],然后再次查看整个域的左半部分和域的右半部分。 例如如果我们在-a和a之间积分f(x),我使用:
计算完整积分double FullDomain = MCRecursion (1e5, LowerBound, UpperBound, f);
double Centre = (Upper + Lower) / 2.0;
double LeftHalf = MCRecursion (1e5, LowerBound, Centre, f);
double RightHalf = MCRecursion (1e5, Centre, UpperBound, f);
然后我通过计算来看待不确定性: 双重差异= fabs(FullDomain - LeftHalf - Righthalf); 从某种意义上看是否有更多的样品是“值得的” 千斤顶
答案 0 :(得分:1)
根据提交者在评论中发布的pastebin:
这不是随机库的问题,而是简单的编程错误。编译代码会抛出警告:
../src/Test.cpp: In function ‘double AdaptiveMCRecursion(double, double, double, double, int, double, double (*)(double))’:
../src/Test.cpp:100:72: warning: ‘Right’ is used uninitialized in this function [-Wuninitialized]
double Right = MCSample (Count, Central, Right, Integrand);
因此该行的所有行为基本上都是未定义的。特别是它会导致函数MCSample
调用未确定的Upper
参数。所以你的结果并不出人意料。你真的很幸运,程序运行完毕。