使用Boost统一生成随机实数

时间:2013-12-30 21:06:04

标签: c++ boost random montecarlo

我正在尝试为蒙特卡洛集成生成一些统一的实数,但我构建的例程返回了一些非常奇怪的值。仔细观察后,我注意到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); 从某种意义上看是否有更多的样品是“值得的” 千斤顶

1 个答案:

答案 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参数。所以你的结果并不出人意料。你真的很幸运,程序运行完毕。