【问题标题】:Possible to select between different Boost pseudo-random number generators at run-time?可以在运行时在不同的 Boost 伪随机数生成器之间进行选择吗?
【发布时间】:2013-05-22 10:05:18
【问题描述】:

我正在使用 Boost Random 库为蒙特卡罗模拟生成随机数。为了检查我的结果,我希望能够为不同的运行使用不同的 RNG 引擎。理想情况下,我想使用命令行选项来确定在运行时使用哪个 RNG,而不是例如在编译时通过 typedef 选择 RNG。

是否有一个基类 T 使得类似下面的事情是可能的;或者如果没有,有一个明显的原因吗?

#include <boost/random.hpp>

int main()
{
    unsigned char rng_choice = 0;
    T* rng_ptr; // base_class pointer can point to any RNG from boost::random

    switch(rng_choice)
    {
        case 0:
            rng_ptr = new boost::random::mt19937;
            break;
        case 1:
            rng_ptr = new boost::random::lagged_fibonacci607; 
            break;          
    }

    boost::random::uniform_int_distribution<> dice_roll(1,6);

    // Generate a variate from dice_roll using the engine defined by rng_ptr:
    dice_roll(*rng_ptr);

    delete rng_ptr;

    return 0;
}

【问题讨论】:

    标签: c++ boost random


    【解决方案1】:

    只需使用Boost.Function 进行类型擦除。

    编辑: 一个简单的例子。

    #include <iostream>
    #include <boost/bind.hpp>
    #include <boost/function.hpp>
    #include <boost/random/uniform_int_distribution.hpp>
    #include <boost/random/mersenne_twister.hpp>
    
    int main() {
      boost::random::mt19937 gen;
      boost::random::uniform_int_distribution<> dist(1, 6);
    
      boost::function<int()> f;
    
      f=boost::bind(dist,gen);
      std::cout << f() << std::endl;
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      例如,查看 source code 的 mersenne twister 似乎没有基类。看来您必须实现所需的类层次结构。

      【讨论】:

      • 为什么要查看源代码?如果没有记录在案的基类,则不应假设存在。
      • 应该始终以某种方式支持像我所做的“没有基类”这样的声明。我可能在文档中错过了它,或者可能只是猜测。源代码是一个坚如磐石的证据。一般来说,在我看来,提供一种方法来验证您的陈述并不是一个坏习惯。
      猜你喜欢
      • 2019-11-17
      • 2016-03-08
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多