可以在运行时选择不同的Boost伪随机数生成器

Possible to select between different Boost pseudo-random number generators at run-time?

本文关键字:Boost 随机数生成器 运行时 选择      更新时间:2023-10-16

我正在使用Boost Random库为蒙特卡罗模拟生成随机数。为了检查我的结果,我希望能够在不同的运行中使用不同的RNG引擎。理想情况下,我想使用命令行选项来确定在运行时使用哪个RNG,而不是在编译时通过类型定义选择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;
}

直接使用Boost。类型擦除的函数。

编辑:一个简单的例子。

#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;
}

例如,查看mersenne twister的源代码,似乎没有基类。看来你必须实现你需要的类层次结构。